SQL查询的优化:如何调整SQL查询的性能

news2024/9/22 11:28:32

查询优化是在合理利用系统资源和性能指标的基础上,定义最有效、最优化的方式和技术,以提高查询性能的过程。查询调整的目的是找到一种方法来减少查询的响应时间,防止资源的过度消耗,并识别不良的查询性能。

在查询优化的背景下,查询处理通过分析查询的执行步骤、优化技术和其他关于查询的信息,确定如何更快地从SQL Server中检索数据。

12个查询优化技巧以提高性能

监测指标可用于评估查询运行时间,检测性能隐患,并显示如何改进。例如,它们包括

  • 执行计划。一个SQL Server查询优化器一步一步地执行查询,扫描索引以检索数据,并在查询执行过程中提供详细的指标概览。
  • 输入/输出统计。用于确定查询执行过程中的逻辑和物理读取操作的数量,帮助用户检测缓存/内存容量问题。
  • 缓冲区缓存。用于减少服务器上的内存使用。
  • 延迟。用于分析查询或操作的持续时间。
  • 索引。用来加速在SQL服务器上的阅读操作。
  • 内存优化的表。用于在内存中存储表数据,使读写操作运行得更快。

方法1:用select字段,不要用select all

SELECT语句是用来从数据库中检索数据的。在大型数据库的情况下,不建议检索所有的数据,因为这将在查询巨大的数据量时占用更多资源,并且我们在业务中能够使用到的所有字段的情况是极其小的。

方法2:避免使用SELECT DISTINCT

SQL DISTINCT操作符用于只选择列的唯一值,从而消除重复的值。它的语法如下。

SELECT DISTINCT column_name FROM table_name;

然而,这可能需要工具处理大量的数据,结果是使查询运行缓慢。例如,你可以通过启用性能指标(如SET STATISTICS语句)并再次用SELECT DISTINCT执行查询来检查。你会发现,这并没有带来一点区别。
相反,为了使查询在SQL Server上运行得更快,你应该避免使用SELECT DISTINCT,只需执行SELECT语句,但要指定列。

方法3: 用INNER JOIN(不是WHERE)创建连接

INNER JOIN语句从连接的表中返回所有匹配的记录,而WHERE子句则根据指定的条件过滤结果的记录。

让我们看看如何用INNER JOIN优化一个特定例子的SQL查询。我们将从HumanResources.Department和HumanResources.EmployeeDepartmentHistory这两个表中检索数据,其中DepartmentIDs是相同的。首先,用INNER JOIN类型执行SELECT语句。

SELECT
  d.DepartmentID
 ,d.Name
 ,d.GroupName
FROM HumanResources.Department d
INNER JOIN HumanResources.EmployeeDepartmentHistory edh
  ON d.DepartmentID = edh.DepartmentID

然后,使用WHERE子句而不是INNER JOIN来连接SELECT语句中的表。

SELECT
  d.Name
 ,d.GroupName
 ,d.DepartmentID
FROM HumanResources.Department d
    ,HumanResources.EmployeeDepartmentHistory edh
WHERE d.DepartmentID = edh.DepartmentID

虽然结果一致,但是带有WHERE子句的查询将不得不浪费更多的资源。因为,首先,它生成所有可能的组合,然后根据条件过滤它们,最后输出结果。

方法4:避免在JOIN谓词中使用多个OR

当你需要从几个表中检索多个列时,建议取消使用OR操作,或将查询分成小的子查询。相反,它评估了OR操作的每个组件,而这又可能导致性能不佳。

方法5: 使用WHERE而不是HAVING来定义过滤器

WHERE子句用于在从表中检索数据时或通过与多个表连接时对所选列定义过滤条件。

HAVING子句用于指定对GROUP BY子句创建的组的过滤条件。此外,HAVING在所有行被选中后对行进行过滤,并在WHERE子句之后执行。

让我们仔细看看下面这个查询。

SELECT
p.BusinessEntityID
,p.FirstName
,p.LastName

FROM Person.Person p
INNER JOIN Person.EmailAddress ea
ON p.BusinessEntityID = ea.BusinessEntityID
GROUP BY p.BusinessEntityID
,p.FirstName
,p.LastName
,ea.EmailAddressID
HAVING ea.EmailAddressID BETWEEN 100 AND 200

首先,该查询从Person.EmailAddress表中扫描数据,然后根据指定范围过滤数据,最后输出结果行。

如果我们用WHERE子句而不是HAVING子句来执行相同的查询,结果集将检索仅限于指定条件的数据,因此,避免了任何额外的扫描和步骤。

SELECT
p.BusinessEntityID
,p.FirstName
,p.LastName

FROM Person.Person p
INNER JOIN Person.EmailAddress ea
ON p.BusinessEntityID = ea.BusinessEntityID
WHERE ea.EmailAddressID BETWEEN 100 AND 200
GROUP BY p.BusinessEntityID
,p.FirstName
,p.LastName
,ea.EmailAddressID

方法6:合理使用通配符

通配符作为单词和短语的占位符,可以加在它们的开头/结尾。为了使数据检索更加有效和快速,你可以在SELECT语句中在短语的末尾使用通配符。例如%通配符、_占位符等。

SELECT
  p.BusinessEntityID
 ,p.FirstName
 ,p.LastName
 ,p.Title
FROM Person.Person p
WHERE p.FirstName LIKE 'And%';

在特定业务中,可以避免全文通配的情况,这样也能提升查询性能。

方法7:使用TOP对查询结果进行采样

SELECT TOP命令是用来设置从数据库中返回的记录数的限制。为了确保你的查询能够输出所需的结果,你可以使用这个命令来获取几条记录作为样本。例如,以上一节的查询为例,在结果集中定义了5条记录的限制,SSMS默认返回1000条数据,其实这是没有必要的。

SELECT TOP 5
  p.BusinessEntityID
 ,p.FirstName
 ,p.LastName
 ,p.Title
FROM Person.Person p
WHERE p.FirstName LIKE 'And%';

方法8:在非高峰期运行查询大型运算

比如我们ERP或者其他业务系统中的日报流水、月报流水汇总等,常常设计到数百万条数据的查询、计算、合并等,这类运算回占据大量内存和运行时间,此类运算最好放到系统资源最宽裕的时候。

方法9:添加索引

在SQL Server中,当你执行一个查询时,优化器可以生成一个执行计划。如果它检测到可能被创建的缺失索引以优化性能,执行计划会在警告部分提出这个建议。有了这个建议,它就会告知你当前的SQL应该为哪些列建立索引,以及完成后的性能可以提高多少。

让我们运行 dbForge Studio for SQL Server 中的查询分析器,看看它是如何工作的:

缺失的索引并不能保证一定会提升更好的性能,它只能提供一个概率。在SQL Server中,你可以使用以下动态管理视图,这些视图可能会帮助你深入了解基于查询执行历史的索引的使用情况:

  • sys.dm_db_missing_index_details。提供有关建议的缺失索引的信息,空间索引除外。
  • sys.dm_db_missing_index_columns: 返回有关不包含索引的表列的信息。
  • sys.dm_db_missing_index_group_stats。返回有关缺失索引组的摘要信息,如查询成本、avg_user_impact(告知你通过增加缺失索引可以提高多少性能),以及其他一些衡量有效性的指标。
  • sys.dm_db_missing_index_groups: 提供包括在一个特定的索引组中的缺失索引的信息。

方法10:尽量减少对任何查询提示的使用

当你面临性能问题时,你可以使用查询提示来优化查询。它们在T-SQL语句中被指定,并使优化器根据该提示选择执行计划。通常,查询提示包括NOLOCK、Optimize For和Recompile Merge/Hash/Loop。然而,你应该仔细考虑它们的用法,因为有时它们可能会引起更多意想不到的副作用、不良影响,甚至在试图解决这个问题时破坏业务逻辑。例如,你为提示写了额外的代码,这些代码在一段时间后可能不适用或过时。这意味着你应该始终监控、管理、检查并保持提示的更新。

方法11:尽量减少大量的写操作

写入、修改、删除或导入大量数据可能会影响查询性能,甚至在需要更新和操作数据、为查询添加索引或检查约束、处理触发器等时,会阻塞表。此外,写入大量的数据会增加日志文件的大小。因此,大量的写操作可能不是一个巨大的性能问题,但你应该意识到它们的后果,并在出现意外行为时做好准备。

方法12:多表查询

当你向一个查询添加多个表时,你可能会超载。此外,大量的表可能会导致执行计划的效率低下。在生成计划时,SQL查询优化器需要确定这些表是如何连接的,以何种顺序,如何以及何时应用过滤器和聚合。

对于SQL查询的优化,你可以把一个查询分成几个独立的查询,这些查询以后可以被连接起来,删除不必要的连接、子查询、表等。

dbForge Studio for SQL Server是SSMS以外的更好的数据库管理工具,除了更好的开发体验以外,还能更简洁的分析SQL开发中的性能问题,欢迎咨询

 

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

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

相关文章

CF1795D Triangle Coloring (组合数学)

链接 题意: 给定一个 n 个点 n 条边的图 ,n 为 6 的倍数,每条边都有边权。 这个图是由 n/3 个三元环构成的 [1,2,3],[4,5,6],[7,8,9],[10,11,12]...... 一个 n12 的图长成这个(唯一): 现在你需要给图染上红…

厂商推送限制说明及极光的适配方案

背景 自2023年起,各个厂商逐步对营销类消息做数量管控,具体如下: 华为 自2023年1月5日起,华为PUSH通道将根据应用类型对资讯营销类消息的每日推送数量进行上限管理,服务与通讯类消息每日推送数量不受限制。详情请参考推…

使用MMDetection进行目标检测、实例和全景分割

MMDetection 是一个基于 PyTorch 的目标检测开源工具箱,它是 OpenMMLab 项目的一部分。包含以下主要特性: 支持三个任务 目标检测(Object Detection)是指分类并定位图片中物体的任务实例分割(Instance Segmentation&a…

服务间调用方式 OpenFeign 的介绍和使用

文章目录前言1、 RestTemplate1.1、通用方法 exchange1.2、RestTemplate 和 OpenFeign 的区别2、RPC 和 HTTP2.1、RPC 是什么2.2、RPC 调用过程示意图2.3、HTTP 是什么2.4、HTTP 调用过程示意图2.5、对比3 、OpenFeign3.1 、OpenFeign 常用注解3.2 、案例前言 Feign 停更了&am…

空间复杂度与时间复杂度

1、时间复杂度和空间复杂度 (1)时间复杂度、空间复杂度是什么? 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,空间效率被称作空间复杂度时间复杂度主要衡量的是一…

Python空间分析| 02 利用Python计算空间局部自相关(LISA)

局部空间自相关 import esda import numpy as np import pandas as pd import libpysal as lps import geopandas as gpd import contextily as ctx import matplotlib.pyplot as plt from geopandas import GeoDataFrame from shapely.geometry import Point from pylab im…

LeetCode 1139. 最大的以 1 为边界的正方形

原题链接 难度:middle\color{orange}{middle}middle 2023/2/17 每日一题 题目描述 给你一个由若干 000 和 111 组成的二维网格 gridgridgrid,请你找出边界全部由 111 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在&am…

Transformer论文阅读:ViT算法笔记

标题:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 会议:ICLR2021 论文地址:https://openreview.net/forum?idYicbFdNTTy 文章目录Abstract1 Introduction2 Related Work3 Method3.1 Vision Transformer3.2…

【已解决】关于 luckysheet 设置纯文本,解决日期格式回显错误的办法

目录 一、现象 二、分析 三、思考过程 五、解决 六、参考链接 一、现象 在excel里面输入内容,如 2023-2-17 12:00 保存后,传回后端的数据被转化成了 数值类型,这显然是一种困扰。 如图所示 二、分析 查阅了文档和一些博客发现 Lucky…

2023美赛ICM F题 详细思路

对于本次美赛F题来说,核心之处就是综合评价模型,但考察我们这个模型的角度较以往常规的制定指标,计算得分给出排名然后分析结果这一套常规流程不同,这次美赛F题出题更贴合实际,整体聚焦在“制定完一个新指标后会带来的…

2019蓝桥杯真题数列求值(填空题) C语言/C++

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 给定数列 1,1,1,3,5,9,17,⋯,从第 4 项开始,每项都是前 3 项的和。 求第 20190324 项的最后 4 位数字。 运行限制 最大运行时间&#xff1a…

三分钟学会用Vim

Vim知识点 目录Vim知识点一:什么是vim二:vim常用的三种模式三:vim的基本操作一:什么是vim vim最小集 vim是一款多模式的编辑器—各种模式—每种模式的用法有差别—每种模式之间可以互相切换 但是我们最常用的就是3~5个模式 vi…

更换ssl证书

更换ssl证书常用证书查看以及转换网址阿里云判断流量以及配置证书判断接入点阿里云控制台配置证书WAFAzure判断流量以及配置证书:判断接入点Azure配置证书CDNAPP GateWay常用证书查看以及转换网址 https://www.chinassl.net/ssltools/convert-ssl.htmlhttps://myss…

【java 高并发编程之JUC】高阶JUC特性总结

1 线程中断机制 1.1 什么是中断? 首先 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。 其次 在Java中没有办法立即停止一条线程,然…

TCP简单说明

前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文…

基于深度学习的个性化推荐系统实时化改造与升级

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2023年1月份热门报告合集ChatGPT的发展历程、原理、技术架构及未来方向《ChatGPT:真格基金分享.pdf》2023年AIGC发展趋势报告:人工智能的下一时代2023年…

ChatGPT初体验step by step:ChatGPT解决人类提出的数理逻辑问题,Python编程实践

ChatGPT初体验step by step:ChatGPT解决人类提出的数理逻辑问题,Python编程实践 如果已有有效的open ai的api key,则跳过本文(1)(2)(3)(4)&#x…

蓝牙 - 如何实现安全性

蓝牙技术在加密上做了很多工作,来保证你的数据安全。 这些年来,我们的许多电子设备都转向了使用无线技术进行连接。我们的鼠标、键盘、耳机和扬声器上不再有长长的纠缠的电线,而使用了简单方便的无线技术,科技进步改善了我们的生活…

亿级高并发电商项目-- 实战篇 --万达商城项目 十(安装与配置Elasticsearch和kibana、编写搜索功能、向ES同步数据库商品数据)

亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 (商家端与用户端功能介绍、项目技术架构、数据库表结构等设计) 亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 (商家端与用户端功能介绍、项目技术架构、数据库表结构等设计&#x…

2023美国大学生数学建模竞赛(美赛)思路代码

2023美国大学生数学建模竞赛(美赛)思路&代码报名时间节点比赛说明问题A(数据分析题):收干旱影响的植物群落(MCM)第一问第二问问题B(仿真建模题):重塑马赛…