运行缓慢或者持续运行很长时间的查询会导致过度的资源消耗。它们可以导致查询阻塞的严重后果。
过度的资源消耗不局限于只占用CPU资源,也会增加I/O带宽以及内存带宽。尽管SQL Server查询可以通过where谓词的限制避免进行全表扫描,但是由于缺少支持这个特定查询所需要的索引,所以他们可能不会按照预期的方式执行。同样,where谓词页可以由应用程序动态进行构建,或者依赖于用户的输入。综上,已经存在的索引不能覆盖所有可能出现的限制。T-SQL语句可能会导致的过度的CPU,I/O,以及内存消耗的情况,在前面的章节中已经有所介绍。
此外,没有使用索引的话,可能是因为存在索引只是没有被使用。因为所有的索引都不得不被维护,这可能不会影响到查询的性能,但是会影响到那些DML的查询。
查询运行缓慢也可以由逻辑锁等待或者系统资源阻塞查询而导致。导致阻塞的原因可以是设计不好的应用程序,不好的查询计划,缺失有效的索引,或者是相对于当前负载配置不足的sql 实例。
这一章专注于导致运行缓慢的两种原因:阻塞和索引问题。
阻塞主要是为了等待逻辑锁,例如等待获取加在资源上的X锁(排他锁)或者等待来在于较低级别同步基元的结果,例如闩锁。
逻辑锁等待发生在某个请求想要在一个已经被加过锁的资源上加上另一个不兼容的锁时。尽管这需要在这个特定的正在运行的查询语句中添加保证数据一致性的事务隔离级别,但是这会让用户有一种SQL Server运行很缓慢的感觉。当一个查询阻塞之后,它就不会在消耗任何的系统资源了,所以你会发现运行速度很慢,但是占用的系统资源很少。
如果你的系统没有被配置成可以处理当前的系统负载,那么会导致等待较低级别的同步基元。
阻塞及等待的通用场景如下:
--确定阻塞者
--确定长的阻塞</…………………………………………………………………………