SQL server 系统优化--通过执行计划优化索引(2)
2008-09-11 19:36
232 查看
今天,继续在客户的系统里优化系统,监视数据库的使用情况,发现有一条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
预估执行计划,看看成本开销:
![](http://images.cnblogs.com/cnblogs_com/zping/145752/o_index21.jpg)
发现,在log表中是聚集索引扫描的,说的清楚一点就是表扫描。肯定是缺少索引的。而log表中超过有46万条数据,这时表扫描的成本很高,
必须在表log中的logtype字段增加索引。
这时查看执行计划:
![](http://images.cnblogs.com/cnblogs_com/zping/145752/o_index22.jpg)
分析:这时发现用了两个索引,一个索引是logtype, 另一个索引是objid(先前建立的索引),两个索引同时搜索并做hash匹配。但是objid的(index scan)成本太高了。执行结果:
表 'log'。扫描计数 18,逻辑读取 11297 次
这时在logtype索引,增加成一个复合索引(logtype,objid),执行计划如下:
![](http://images.cnblogs.com/cnblogs_com/zping/145752/o_index23.jpg)
分析:这时发现就是索引seek的成本占了47%,效率很高,看看执行结果的IO次数:
表 'log'。扫描计数 9,逻辑读取 3793 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
发现:IO次数比上面的两个索引效率大大减少,在(logtype,objid)建立复合索引,速度提高很大,从表扫描到索引查找(index seek),效率和性能大大提高。
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
预估执行计划,看看成本开销:
![](http://images.cnblogs.com/cnblogs_com/zping/145752/o_index21.jpg)
发现,在log表中是聚集索引扫描的,说的清楚一点就是表扫描。肯定是缺少索引的。而log表中超过有46万条数据,这时表扫描的成本很高,
必须在表log中的logtype字段增加索引。
这时查看执行计划:
![](http://images.cnblogs.com/cnblogs_com/zping/145752/o_index22.jpg)
分析:这时发现用了两个索引,一个索引是logtype, 另一个索引是objid(先前建立的索引),两个索引同时搜索并做hash匹配。但是objid的(index scan)成本太高了。执行结果:
表 'log'。扫描计数 18,逻辑读取 11297 次
这时在logtype索引,增加成一个复合索引(logtype,objid),执行计划如下:
![](http://images.cnblogs.com/cnblogs_com/zping/145752/o_index23.jpg)
分析:这时发现就是索引seek的成本占了47%,效率很高,看看执行结果的IO次数:
表 'log'。扫描计数 9,逻辑读取 3793 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
发现:IO次数比上面的两个索引效率大大减少,在(logtype,objid)建立复合索引,速度提高很大,从表扫描到索引查找(index seek),效率和性能大大提高。
总结:
通过执行计划来优化索引,有时两个索引的使用效率要远低于一个索引,这时必须考虑根据业务要求建立复合索引。相关文章推荐
- SQL server 系统优化--通过执行计划优化索引(1)
- SQL server 系统优化--通过执行计划优化索引(3)
- SQL server 系统优化--通过执行计划优化索引(1) (转)
- 优化 SQL Server 查询性能----分析执行计划,索引与索引视图,如何识别要优化的查询
- 优化 SQL Server 查询性能----分析执行计划,索引与索引视图,如何识别要优化的查询
- SQL Server 强大的分区技术优化执行计划索引实例详解(使用语句检测和优化数据库 (MSSQL个人笔记之数据库优化之路 四)
- sql server 数据库优化--显示执行计划 你真的知道索引使用???
- 通过分析SQL语句的执行计划优化SQL(总结)
- mysql查缺补漏(二)mysql5.6性能优化(explain执行计划术语,索引,优化查询)
- SQL Server现场优化纪实(一):通过重建索引提高性能
- SQL Server 查询优化(测试02)参数嗅探-执行计划选择
- 第六章——根据执行计划优化性能(2)——查找表/索引扫描
- 通过分析SQL语句的执行计划优化SQL (五)
- 通过分析SQL语句的执行计划优化SQL(三)
- SQL Server索引的执行计划
- 通过分析SQL语句的执行计划优化SQL
- SQL Server-聚焦使用索引和查询执行计划
- 通过分析SQL语句的执行计划优化SQL(总结)
- 通过分析SQL语句的执行计划优化SQL(总结)
- 初探Sql Server 执行计划及Sql查询优化