加速 SQL 查询的 9 种方法

SQL 是开发和查询数据库的主要语言,但它有一些怪癖。在我的上一篇文章中,我分享了 7 个需要避免的 SQL 错误。现在,让我们来看看编写更快的 SQL 查询的 9 个最佳实践。

更快 SQL 查询的 9 个最佳实践

  1. 仅检索您需要的列

  2. 使用 CASE 而不是 UPDATE 进行条件列更新

  3. 将大表查询保持在最低限度

  4. 预先准备您的数据

  5. 批量执行删除和更新

  6. 使用临时表提高游标性能

  7. 使用表值函数而不是标量函数

  8. 使用分区来避免大量数据移动

  9. 使用存储过程来提高性能,使用 ORM 来提高便利性

仅检索您需要的列

一个常见的 SQL 习惯是在查询上使用SELECT *,因为列出所需的所有列是很乏味的。另外,有时这些列可能会随着时间的推移而改变,所以为什么不以简单的方式做事呢?

但是,如果您查询具有一百个或更多列的表上的所有列,会发生什么情况?这些庞然大物在野外以令人沮丧的规律性出现,并且并不总是能够将它们重新设计为更理智的模式。有时,驯服这头野兽的唯一方法是选择列的子集,这可以防止其他查询资源匮乏。

在对查询进行原型设计时使用是可以的SELECT *,但是任何进入生产的内容都应该只请求实际使用的列。

使用 CASE 而不是 UPDATE 进行条件列更新

开发人员经常做的其他事情是UPDATE ... WHERE根据另一列的值设置一列的值,例如UPDATE Users SET Users.Status="Legacy" WHERE Users.ID<1000. 这种方法简单直观,但有时会增加不必要的步骤。

例如,如果您将数据插入表中,然后使用UPDATE它来更改它,就像我刚才所示,那么这是两个单独的事务。当您有数百万行时,额外的事务可能会创建许多不必要的操作。

对于如此大规模的操作,更好的解决方案是在插入操作本身期间CASE,在查询中使用内联语句来设置列值。这样,您可以在一次传递中处理初始插入和修改的数据。

将大表查询保持在最低限度

对任何大小的表的查询都不是免费的。对数亿或数十亿行的表进行查询绝对不是免费的。

只要有可能,将对大表的查询合并为尽可能少的离散操作。例如,如果您有一个表,您想要先按一列查询,然后再按另一列查询,请首先将其合并到单个查询中,然后确保您要查询的列具有覆盖索引。

如果您发现自己从大表中获取相同的数据子集并对其运行较小的查询,则可以通过在其他地方保留该子集并对其进行查询来为自己和其他人加快速度。这引出了下一个技巧。

预先准备您的数据

假设您或组织中的其他人经常运行需要通过连接多个大型表来聚合大量数据的报告或存储过程。您不必每次都重新运行联接,而是可以通过将其“预先暂存”到专门用于此目的的表中来为自己(和其他人)节省大量工作。然后,报告或过程可以针对该表运行,因此它们共同的工作只需完成一次。如果您有足够的资源,并且您的数据库支持它,您可以使用内存表来进一步加快速度。

批量执行删除和更新

想象一个拥有数十亿行的表,需要从中清除数百万行。简单的方法是简单地DELETE在事务中运行 a 。但随后整个表将被锁定,直到事务完成。

更复杂的方法是批量执行删除(或更新)操作,可以与其他操作交错。每个事务变得更小并且更易于管理,并且其他工作可以在操作周围和操作期间进行。

在应用程序方面,这是任务队列的一个很好的用例,它可以跟踪跨会话的操作进度,并允许它们作为低优先级后台操作执行。

使用临时表提高游标性能

在大多数情况下,应该避免使用游标——它们很慢,它们会阻止其他操作,而且它们完成的任何事情几乎总是可以通过其他方式完成。不过,如果您因某种原因而无法使用游标,临时表可以减少随之而来的性能问题。

例如,如果您需要循环遍历表并根据某些计算更改列,您可以获取要更新的候选数据,将其放入临时表中,使用游标循环遍历该表,然后应用所有在单个操作中更新。您还可以通过这种方式将游标处理分解为批次。

使用表值函数而不是标量函数

标量函数可让您将计算封装到类似存储过程的 SQL 片段中。将标量函数的结果作为SELECT查询中的列返回是常见的做法。

如果您发现自己在 Microsoft SQL Server 中经常这样做,则可以通过使用表值函数并 CROSS APPLY 在查询中使用来获得更好的性能。有关很少讨论的APPLY运算符的更多信息,请参阅Microsoft Virtual Academy 的此培训模块。

使用分区来避免大量数据移动

SQL Server Enterprise 提供“分区”功能,允许您将数据库表拆分为多个分区。如果您经常将一个表归档到另一个表中,则可以避免使用它INSERT/DELETE来移动数据,而是使用它SWITCH。

例如,如果您有一个每天清空到存档表中的表,则可以通过SWITCH简单地将每日表中的页面分配给存档表来执行此清空和复制操作。切换过程所需的时间比手动复制和删除要少几个数量级。Cathrine Wilhelmsen 有一个关于如何以这种方式使用分区的优秀教程。

使用存储过程来提高性能,使用 ORM 来提高便利性

ORMS(对象关系映射器)是生成以编程方式生成的 SQL 代码的软件工具包。它们允许您使用应用程序的编程语言及其隐喻来开发和维护您的查询。

许多数据库开发人员原则上不喜欢 ORM。它们因生成低效且有时无法优化的代码而臭名昭著,并且它们使开发人员学习 SQL 和了解其查询在做什么的动力较少。当开发人员需要手动编写查询以获得最佳性能时,他们不知道如何操作。

另一方面,ORM 使编写和维护数据库代码变得更加容易。应用程序的数据库部分并没有位于另一个域的某个地方,并且它的编写方式与应用程序逻辑的耦合更加松散。

对于经常调用、需要良好性能、不太可能经常更改(如果有的话)并且需要通过数据库分析工具调查性能的查询,使用存储过程是最有意义的。与即席查询相比,大多数数据库都可以更轻松地为存储过程获取此类统计信息。数据库的查询规划器也更容易优化存储过程。

将更多数据库逻辑移至存储过程的缺点是逻辑与数据库的耦合更加紧密。存储过程可能会从性能优势转变为巨大的技术债务。如果您决定稍后迁移到另一种数据库技术,则更改 ORM 的目标比重写所有存储过程更容易。此外,还可以检查 ORM 生成的代码以进行优化,并且查询缓存通常允许重用最常生成的查询。

如果应用程序端的可维护性很重要,请使用 ORM。如果是数据库端性能,就使用存储过程。


作者:Serdar Yegulalp

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PPT中加入页码

PPT中加入页码 文章目录 简单版本样式更改 简单版本 PPT中插入页码&#xff0c;基础的就是在“插入”选项卡中单机“幻灯片编号”即可 样式更改 然而&#xff0c;就像我们做幻灯片不满足于白底黑字一样&#xff0c;页码也总不能是默认的样式。 比如&#xff0c;在页码下面…

2023年全国省市区县行政区划矢量数据(含10段线)

2023年&#xff0c;中国地图面貌发生了重大变化&#xff0c;领土面积由960万平方公里扩大到1045万平方公里&#xff0c;九段线改为了十段线。 因此在使用地图的时候&#xff0c;特别是做全国的地图的时候&#xff0c;一定需要最新的行政界限&#xff0c;今天就将最新的省市县行…

http请求超时 ,用PHP如何解决的?

当进行HTTP请求时&#xff0c;有时候可能会遇到请求超时的情况。为了解决这个问题&#xff0c;你可以考虑以下几个方面&#xff1a; 设置脚本的最大执行时间&#xff1a; 在PHP中&#xff0c;可以使用set_time_limit函数来设置脚本的最大执行时间。该函数接受一个以秒为单位的整…

串口发送控制命令,实现一些外设LED 风扇 马达

main.c #include "uart4.h"int main(){char a;char buf[128];uart4_config();while (1){/* //接收一个字符数据agetchar();//发送接收的字符1putchar(a1);putchar(\r);putchar(\n); */gets(buf); // 读取字符串//puts(buf); // 输出字符串if(strcmp(buf,"l…

linux无法访问共享目录,ls hgfs失败

刚在新买的华为电脑上安装ubuntu20&#xff0c;共享文件出现各种问题&#xff1a; dlubuntu:/mnt$ ls ls: cannot access hgfs: Permission denied hgfs 解决方法&#xff1a; 1.首先输入vmware-hgfsclient&#xff0c;看看是否共享文件夹已经建立&#xff0c;没有的话去参考…

在Vue3中使用qrcode库实现二维码生成

本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 目录 一、基础用法实现二、toDataURL()方法三、toCanvas()方法四、create()方法五、QRCodeRenderersOptions()方法 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑。常用的库有 qrcode和 vue-qrcode…

支付平台在选择服务器租用时要注意什么?

如果要建设一个支付平台的话要进行服务器租用&#xff0c;一旦涉及到钱的方面就必须要顾虑到多方面&#xff0c;这样才能保证安全性&#xff0c;今天小编就给大家讲一讲要注意什么呢&#xff1f; 1、带宽:带宽是业务稳定性的直接因素&#xff0c;只有带宽充足&#xff0c;这样…

kafka发送大消息

1 kafka消息压缩 kafka关于消息压缩的定义&#xff08;来源于官网&#xff09;&#xff1a; 此为 Kafka 中端到端的块压缩功能。如果启用&#xff0c;数据将由 producer 压缩&#xff0c;以压缩格式写入服务器&#xff0c;并由 consumer 解压缩。压缩将提高 consumer 的吞吐量…

使用 pytest.ini 文件控制输出 log 日志

一、前置说明 pytest.ini 文件中可以配置参数来控制 pytest 的运行行为,其存放路径要求与 conftest.py 一样。 项目根目录project_root/ ├── pytest.ini ├── tests/ │ └── test_demo.py以test开头的测试子目录project_root/ ├── tests/ │ ├── pytest.in…

c# OpenCvSharp透视矫正六步实现透视矫正(八)

透视矫正,引用文档拍照扫描&#xff0c;相片矫正这块。 读取图像Cv2.ImRead();预处理&#xff08;灰度化&#xff0c;高斯滤波、边缘检测&#xff09;轮廓检测&#xff08;获取到最大轮廓&#xff09;获取最大面积轮廓的四个顶点标识最小矩形坐标透视矫正显示 完整代码 // 1、…

Linux系统安装及管理

目录 一、Linux应用程序基础 1.1应用程序与系统命令的关系 1.2典型应用程序的目录结构 1.3常见的软件包装类型 二、RPM软件包管理 1.RPM是什么&#xff1f; 2.RPM命令的格式 2,1查看已安装的软件包格式 2.2查看未安装的软件包 3.RPM安装包从哪里来&#xff1f; 4.挂…

web前端项目-七彩夜空烟花【附源码】

web前端项目-七彩动态夜空烟花【附源码】 本项目仅使用了HTML&#xff0c;代码简单&#xff0c;实现效果绚丽&#xff0c;且本项目代码直接运行即可实现&#xff0c;无需图片素材&#xff0c;接下来让我们一起实现一场美丽的烟花秀叭 运行效果&#xff1a;鼠标点击和移动可控制…

理解SpringMVC的工作流程

组件 前置控制器 DispatcherServlet。 映射控制器 HandlerMapping。 处理器 Controller。 模型和视图 ModelAndView。 视图解析器 ViewResolver。 工作流程 spring mvc 先将请求发送给 DispatcherServlet。 DispatcherServlet 查询一个或多个 HandlerMapping&#xff0c;找到…

vc 用MySQL Connector/C++

1 下载 MySQL :: Download Connector/C 2 vc配置 添加路径 2.1 右击项目 -> 属性 2.2 配置属性-> vc目录 -> 包含目录 -> 添加 D:\mysql-connector-c-8.2.0-winx64\include\jdbc 具体目录在mysql-connector-c的文件夹中搜索 mysql_driver.h文件 然后把这个文件…

jmeter-set up先登录获取token,再测试

一、何为setup 一种特殊类型的线程组&#xff0c;可用于执行预测试操作&#xff1b;简单来讲就是执行测试线程组前&#xff0c;先执行setup 作用 例如前面&#xff0c;我们说到的&#xff0c;压测之前只用JMeter调用业务接口造数或者通过JDBC操作数据库造数&#xff0c;可以放…

Spring中BeanFactoryPostProcessors的使用和原理

Spring中的BeanFactoryPostProcessor是在Spring容器实例化Bean之后&#xff0c;初始化之前执行的一个扩展机制。它允许开发者在Bean的实例化和初始化之前对BeanDefinition进行修改和处理&#xff0c;从而对Bean的创建过程进行干预和定制化。 BeanFactoryPostProcessor接口定义…

信息网络协议基础-接入网技术

文章目录 概述***基于ATM架构虚电路PVC和SVC信元格式为什么信元格式由AAL决定?网络架构传统电信网络:点对点链路PPP协议协议内容消息过程多协议封装功能电话网接入Internet(DSL 数字用户线路)主要接入技术ADSL关键技术DMTDSLAM体系结构PPPOE帧格式过程特点局域网定义参考模型L…

网络安全法规和模型

基础 ISO信息安全&#xff1a;为数据处理系统建立和采取技术、管理的安全保护&#xff0c;保护计算机硬件、软件、数据不因偶然的或恶意的原因而受到破坏、更改、泄露 信息安全属性&#xff1a; CIA三元组&#xff1a;保密性、完整性、可用性 其他属性&#xff1a;真实性、不…

sql查询分数排名

编写一个 sql 查询来实现分数排名。 如果两个分数相同&#xff0c;则两个分数排名&#xff08;rank&#xff09;相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔”。 ----------- | id | score | ---------…

前端---表格标签

1. 表格的结构 表格是由行和列组成&#xff0c;好比一个excel文件 2. 表格标签 <table>标签&#xff1a;表示一个表格 <tr>标签&#xff1a;表示表格中的一行 <td>标签&#xff1a;表示表格中的列<th>标签&#xff1a;表示表格中的表头 示例代码: &l…