可以应用哪些通用技术来优化SQL查询?
时间:2020-03-05 18:46:23 来源:igfitidea点击:
哪些技术可以有效地应用于提高SQL查询的性能?是否有适用的一般规则?
解决方案
回答
我认为使用SQL查询分析器将是一个不错的开始。
回答
在Oracle中,我们可以查看解释计划以比较查询的变体
回答
- 使用主键
- 避免选择*
- 建立条件语句时要尽可能具体
- 去标准化通常可以更有效
- 表变量和临时表(如果有)通常会比使用大型源表更好
- 分区视图
- 使用指标和约束
回答
确保我们在表上具有正确的索引。如果我们经常使用列作为排序或者限制数据集的方式,则索引可能会产生很大的不同。我在最近的一篇文章中看到,选择" distinct"确实会减慢查询速度,尤其是在没有索引的情况下。
回答
SELECT查询的明显优化是确保我们在用于联接的列或者WHERE子句中具有索引。
由于添加索引可能会减慢数据写入速度,因此我们需要监控性能以确保不会破坏数据库的写入性能,但这就是使用良好的查询分析工具可以相应地平衡事务的地方。
回答
我们可以做的最大的事情就是在sql server查询分析器中查找表扫描(确保我们打开"显示执行计划")。否则,在MSDN和其他地方有无数的文章会提供很好的建议。
顺便说一句,当我开始学习优化查询时,我对跟踪运行了sql server query profiler,查看了生成的SQL,并试图找出为什么这是一个改进。查询分析器远非最佳,但它是一个不错的开始。
回答
- 指标
- 统计数据
- 在Microsoft堆栈上,数据库引擎优化顾问
回答
了解实际情况,我们应该能够详细了解以下概念:
- 索引(不仅是索引,而且实际上是如何工作的)。
- 聚集索引与堆分配表。
- 文本和二进制查找以及何时可以内联。
- 填充因子。
- 记录如何重影以进行更新/删除。
- 何时发生页面拆分以及原因。
- 统计信息,以及它们如何影响各种查询速度。
- 查询计划程序及其对特定数据库的工作方式(例如,在某些系统上," select *"运行缓慢,在现代MS-Sql DB上,计划程序可以处理该查询程序)。
回答
我们可以考虑以下几项来优化查询性能。
- 确保我们只拥有最少的数据。确保仅选择所需的列。将字段大小减小到最小。
- 考虑对数据库进行非规范化以减少联接
- 避免循环(即获取游标),坚持设置操作。
- 将查询实现为存储过程,因为它是预编译的,并且将更快地执行。
- 确保我们设置了正确的索引。如果数据库主要用于搜索,请考虑使用更多索引。
- 使用执行计划来查看处理过程。我们要避免的是表格扫描,因为这样做成本很高。
- 确保将"自动统计信息"设置为"开"。 SQL需要此来帮助确定最佳执行。有关更多信息,请参见Mike Gunderloy的精彩文章。 SQL Server 2005中的统计基础
- 确保索引没有碎片。减少SQL Server索引碎片
- 确保表没有碎片。如何在SQL Server 2000和2005中检测表碎片
回答
使用with语句处理查询过滤。
将每个子查询限制为可能的最小行数。
然后加入子查询。
WITH master AS ( SELECT SSN, FIRST_NAME, LAST_NAME FROM MASTER_SSN WHERE STATE = 'PA' AND GENDER = 'M' ), taxReturns AS ( SELECT SSN, RETURN_ID, GROSS_PAY FROM MASTER_RETURNS WHERE YEAR < 2003 AND YEAR > 2000 ) SELECT * FROM master, taxReturns WHERE master.ssn = taxReturns.ssn
with语句中的子查询可能最终与内联视图相同,
或者自动生成的临时表。我在零售数据方面的工作中发现,大约有70-80%的时间可以提高性能。
100%的时间都有维护收益。