sql server08 查询优化系列 1

sql server 性能杀手:

  • 低质量的索引
  • 不精确的统计
  • 过多的阻塞和死锁
  • 不基于数据集的操作,通常是 游标
  • 低质量的查询设计
  • 低质量的数据库设计
  • 过多的碎片
  • 不可重用的执行计划
  • 低质量的查询计划,通常是因为 参数嗅探 所导致的。
  • 执行计划频繁重编译
  • 游标的错误使用
  • 数据库日志的错误配置
  • 过多使用或者错误配置 tempdb

阻塞和死锁:

因为sql server 的 ACID特性,所以数据库引擎确保并发事务 被正确的互相隔离.

默认情况下,一个是所看见的数据 是另一个事务修改之前或之后的状态--不会看到中间状态的.

 

因为这种隔离性,当多个事务尝试 以一种不兼容的方法 并发访问公共资源时,数据库中发生阻塞.

当两个资源尝试升级或者拓展加锁的资源并且与另一个冲突时,就会发生死锁.

查询引擎确定回滚开销最低的进程 并选择 其为 死锁牺牲品.

为了得到可伸缩的多用户数据库应用程序性能,正确地空值查询的隔离级别和 事务范围 以最小化 阻塞和死锁是很关键的.

 

数据集:

t-sql是一种基于数据集的脚本语言,意味着他在数据集上操作.这就强迫你 从列的方面而不是从行的方面考虑.

不基于数据集的思路导致 过多的使用游标 和循环 而不是研究更有效的 连接和子查询,

 

低质量的查询设计:

索引的有效性完全取决于 查询的方法.

 

低质量的数据库设计

数据库应该充分的规范化以增加数据检索的性能并减少阻塞.

例如 有一个不规范的数据库, 将客户订单和客户信息存储在一张表里. 那么客户信息 在所有客户订单上都要重复.

这将 增加读取 客户订单 的I/O操作,  于此同时, 当 添加 插入一个订单时,因为订单包含客户信息,那么僵组织其他数据

写入程序/读取程序 访问这些客户的资料.

过分的规范化,也是不行的.将产生过多的 连接查询,

过多的碎片

如果 数据页 包含了 不按顺序的碎片,或者由于频繁页面分割而包含少量的数据,那么数据检索操作 将会扫描更多的页面.

posted @ 2012-05-11 10:02  高捍得  阅读(290)  评论(0编辑  收藏  举报