数据库版本:SQL Server 2008R2.
前几天在审计的时候发现一个数据库的压力稍高,理论山现有的访问压力不应该使服务器压力达到这样的高度。在优化过程中发现,一类百万量级表上的查询无法使用到索引。显示的执行计划如下,很明显,SQL 执行过慢是因为全部走了主键查找。
统计信息显示如下:
表 'AccountCallbackInfo_4'。扫描计数 1,逻辑读取 4584855 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
奇怪的是该表上建的有该SQL 查询条件所要使用的索引,但是查询优化器并没有使用到,难道是查询优化器判断有误。
在查询的时候强制使用索引试下。
select top 100 id from Table with(nolock,index(ix_AccountCallbackInfo_DONotDelete)) where TradingServiceType = 1 and NextCallbackTime<='2011-11-07 00:01:46' and CallBackOperationType =4 and CallbackStatus = 0 order by CreatedDate ASC
这次的统计信息如下。
(100 行受影响)
表 Table。扫描计数 2,逻辑读取 622 次,物理读取 0 次,预读 6 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1 行受影响)
SQL Server 执行时间:
CPU 时间 = 1298 毫秒,占用时间 = 186 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
可以看到两次的IO量级差了5个量级。查询时间上也差了很多倍。
---有时间需要研究下优化引擎怎么使用统计信息的。