性能调优 SQL - 如何?
Posted
技术标签:
【中文标题】性能调优 SQL - 如何?【英文标题】:Performance Tuning SQL - How? 【发布时间】:2009-01-21 00:08:52 【问题描述】:如何调整 SQL 查询的性能?
可以使用哪些技巧/工具/概念来改变 SQL 查询的性能? 如何量化收益? 需要注意什么?可以使用哪些技巧/工具/概念来改变 SQL 查询的性能?
使用索引?它们在实践中是如何工作的? 规范化与非规范化数据?性能与设计/维护之间的权衡是什么? 预处理中间表?使用触发器或批处理作业创建? 重组查询以使用临时表、子查询等? 将复杂的查询分成多个并联合结果? 还有别的吗?如何量化绩效?
阅读? CPU 时间? 不同版本一起运行时的“% Query Cost”? 还有别的吗?需要注意什么?
是时候生成执行计划了吗? (存储过程与内联查询) Stored Procs 被强制重新编译 在小型数据集上进行测试(查询是线性扩展还是平方定律等?) 缓存之前运行的结果 优化“正常情况”,但损害“最坏情况” 什么是“参数嗅探”? 还有别的吗?版主注意事项: 这是一个很大的问题,我应该把它分成多个问题吗?
回复者注意事项: 因为这是一个很大的问题,请参考其他问题/答案/文章,而不是写冗长的解释。
【问题讨论】:
【参考方案1】:我非常喜欢《Professional SQL Server 2005 Performance Tuning》这本书来回答这个问题。这是 Wiley/Wrox,不,我不是作家,呵呵。但它解释了您在此处要求的许多内容,以及硬件问题。
但是,是的,这个问题远远超出了可以在像这样的评论框中回答的范围。
【讨论】:
+1 我同意一本好书是一个很好的步骤,我喜欢里面的 sql server 2005 性能调优【参考方案2】:编写 sargable 查询是需要做的事情之一,如果您不编写 sargable 查询,那么优化器就无法利用索引。这是一个例子Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code 这个查询从超过 24 小时到 36 秒
【讨论】:
【参考方案3】:当然你还需要知道这3个join的区别
循环连接, 哈希连接, 合并连接
请看这里:http://msdn.microsoft.com/en-us/library/ms173815.aspx
【讨论】:
【参考方案4】:这里有一些需要遵循的基本步骤:
-
首先定义业务需求
SELECT
字段而不是使用 SELECT *
避免SELECT DISTINCT
使用INNER JOIN
(不是WHERE
)创建联接
使用WHERE
而不是HAVING
来定义过滤器
正确的索引
【讨论】:
【参考方案5】:我们可以按照以下一些基本步骤来提高性能:
-
检查 pk 和 fk 中的索引以查找所涉及的表,如果它仍然需要时间索引查询中存在的列。
每次操作后都会修改所有索引,因此请不要对每一列都进行索引
在批量插入之前删除索引,然后重新创建索引。
谨慎选择
使用 if exists 而不是 count
在指责 dba 之前先检查网络连接
【讨论】:
以上是关于性能调优 SQL - 如何?的主要内容,如果未能解决你的问题,请参考以下文章