优化引擎判断有误

来源:互联网 发布:java io流面试题 编辑:程序博客网 时间:2024/05/01 19:49

        数据库版本: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个量级。查询时间上也差了很多倍。

---有时间需要研究下优化引擎怎么使用统计信息的。

 

 

原创粉丝点击