本文共 4979 字,大约阅读时间需要 16 分钟。
当你接手一个系统时,通常是从检查系统负载,cpu、内存使用率开始,查看statspack top5等待事件,逻辑读、物理读排名靠前的sql语句等等,然后进行初步的优化。而随着业务的深入了解,你开始从系统的角度去考虑据库设计,考虑应用实 现的合理性,是否有更好的改进方案等。假设通过statspack报表找到了很耗资源的sql,表分析过,执行计划也是走索引,这种情况下怎么去判断 sql是优化的?看下面的实际案例:
1.提取逻辑读排名靠前的sql
2.查看执行计划
从执行计划来看,sql走以create_date为开头的索引,而在oltp系统中,查询比较频繁的sql是不适合走时间索引的。
3.查看语句执行时间
这个语句查询时间在5.3秒左右,对于查询频繁的oltp系统中,毫无疑问全表扫描的代价是最高的,按时间索引扫描数据效率也是很低的,毕竟一个时 间段的数据也是不少的。仔细分析这个sql语句,如果status,rule_id列稀疏读很高的话,这些列建立索引性能是否会有很大的提高呢?
4.查看表数据分布
根据随机抽取几天数据分布结果来看,表中97%以上数据的status都等于3,而status不等于3的数据量很少很少,以status列来建立 索引,性能应该会有很大的提高。我们来分析一下status=3的情况,status为3占表中的大部分数据,这种查询会消耗大量资源,甚至是全表扫描, 显然不适合放在查询频繁的oltp系统中,DBA也不允许这种sql部署到生产系统上,数据库压力太大。其实还要综合考虑deal_id的数据分布,我就 武断的略过了,我的目的是给大家提供一种思路。
5.尝试以status建立新索引
新执行计划
可以看到sql语句走新的执行计划了,我们再来验证一下该语句的执行时间。
6.重新执行该语句
调整后的查询时间在0.2秒左右,速度提高了100倍左右,我只是简单的把索引列位置调换一下,性能就有了很大提高,statspack看不到这条语句。
总的来说,索引建立之前需要结合实际应用和数据分布进行分析再分析,我通常会考虑下面几点
--EOF--
转载地址:http://jjizn.baihongyu.com/