SQL server 系统优化--通过执行计划优化索引(2)

    今天,继续在客户的系统里优化系统,监视数据库的使用情况,发现有一条sql语句执行速度很慢,竟然要14S,太慢了,

   SQL语句如下:

select   top   50  d.id, count ( * ) c  from  docbase d, log  l ,categorylink cl 
where  d.isdelete = 0   and  l.objid  =  d.id  and  l.logtype = ' 402881e40b6093bf010b60a5849c0007 '  
and  d.createdate  >= ' 0000-00-00 '   and  d.createdate  <= ' 9999-99-99 '   and  d.id =  cl.objid  and  d.pid  is   null   group   by  d.id  order   by  c  desc ,d.id  desc

   预估执行计划,看看成本开销:

   SQL server 系统优化--通过执行计划优化索引(2)

  发现,在log表中是聚集索引扫描的,说的清楚一点就是表扫描。肯定是缺少索引的。而log表中超过有46万条数据,这时表扫描的成本很高,

  必须在表log中的logtype字段增加索引。

   这时查看执行计划:

    SQL server 系统优化--通过执行计划优化索引(2)

    分析:这时发现用了两个索引,一个索引是logtype, 另一个索引是objid(先前建立的索引),两个索引同时搜索并做hash匹配。但是objid的(index scan)成本太高了。执行结果:

表  ' log ' 。扫描计数  18 ,逻辑读取  11297  次

   这时在logtype索引,增加成一个复合索引(logtype,objid),执行计划如下:

  SQL server 系统优化--通过执行计划优化索引(2)

  分析:这时发现就是索引seek的成本占了47%,效率很高,看看执行结果的IO次数:

表  ' log ' 。扫描计数  9 ,逻辑读取  3793  次,物理读取  0  次,预读  0  次,lob 逻辑读取  0  次,lob 物理读取  0  次,lob 预读  0  次。

  发现:IO次数比上面的两个索引效率大大减少,在(logtype,objid)建立复合索引,速度提高很大,从表扫描到索引查找(index seek),效率和性能大大提高。

  总结:

     通过执行计划来优化索引,有时两个索引的使用效率要远低于一个索引,这时必须考虑根据业务要求建立复合索引。

你可能感兴趣的:(SQL Server)