sql server08 查询优化系列 1
sql server 性能杀手:
- 低质量的索引
- 不精确的统计
- 过多的阻塞和死锁
- 不基于数据集的操作,通常是 游标
- 低质量的查询设计
- 低质量的数据库设计
- 过多的碎片
- 不可重用的执行计划
- 低质量的查询计划,通常是因为 参数嗅探 所导致的。
- 执行计划频繁重编译
- 游标的错误使用
- 数据库日志的错误配置
- 过多使用或者错误配置 tempdb
阻塞和死锁:
因为sql server 的 ACID特性,所以数据库引擎确保并发事务 被正确的互相隔离.
默认情况下,一个是所看见的数据 是另一个事务修改之前或之后的状态--不会看到中间状态的.
因为这种隔离性,当多个事务尝试 以一种不兼容的方法 并发访问公共资源时,数据库中发生阻塞.
当两个资源尝试升级或者拓展加锁的资源并且与另一个冲突时,就会发生死锁.
查询引擎确定回滚开销最低的进程 并选择 其为 死锁牺牲品.
为了得到可伸缩的多用户数据库应用程序性能,正确地空值查询的隔离级别和 事务范围 以最小化 阻塞和死锁是很关键的.
数据集:
t-sql是一种基于数据集的脚本语言,意味着他在数据集上操作.这就强迫你 从列的方面而不是从行的方面考虑.
不基于数据集的思路导致 过多的使用游标 和循环 而不是研究更有效的 连接和子查询,
低质量的查询设计:
索引的有效性完全取决于 查询的方法.
低质量的数据库设计
数据库应该充分的规范化以增加数据检索的性能并减少阻塞.
例如 有一个不规范的数据库, 将客户订单和客户信息存储在一张表里. 那么客户信息 在所有客户订单上都要重复.
这将 增加读取 客户订单 的I/O操作, 于此同时, 当 添加 插入一个订单时,因为订单包含客户信息,那么僵组织其他数据
写入程序/读取程序 访问这些客户的资料.
过分的规范化,也是不行的.将产生过多的 连接查询,
过多的碎片
如果 数据页 包含了 不按顺序的碎片,或者由于频繁页面分割而包含少量的数据,那么数据检索操作 将会扫描更多的页面.