性能调优 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 - 如何?的主要内容,如果未能解决你的问题,请参考以下文章

SQL调优实战-常见性能调优案例介绍(第二期)

[性能调优]如何通过读PeopleSoft Trace文件来调优

SQL查询性能调优--如何使查询更快

MySQL 性能调优——SQL 查询优化

2022-02-24-Spark-44(性能调优通用调优)

《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习