在分区表上使用正确的索引来提高性能

问题提出:
一个三表链接,其中都是通过主键来链接的,而且查询条件只有一个,而且这个列的选择性非常高,基本上99.9的数据都不相同。其中一个表数据量在千万,其他在百万,这个sql一天会执行几十万次,占用了大量的系统资源。[@more@]

查看后得知千万级的表是分区表,根据时间进行分区,10天一个分区。其中查询条件上也建立了索引,不过建立的时候因为在分区表上建立索引,所以建立的缺省是LOCAL的索引。因此导致sql运行的时候,虽然可以正确的使用索引来查找,但是却要跨越多个分区才能找到正确的值,并得到ROWID再得到表中的数据。因为开发认为正确的使用了索引,效率很高,所以在查询条件上就只使用了建立索引的条件。
解决的办法有两个,一个是把LOCAL的分区索引改成GLOBAL的索引,二是增加一个查询条件,因为此sql只需要查询当天的数据,所以在分区的时间字段上加上一个条件,保险期间,条件为>SYSDATE-2。
方法1操作麻烦,因为涉及到索引的删除和重建,而此sql跑的这么频繁,估计够呛。
方法2操作简单,只需要改改程序就ok。此方案实施后,consistent gets从1341降低到133,假如查询跨越两个分区,也比原来低很多。

总结:对于分区表上的索引,创建的时候还是要慎重。

后续:pub中有网友也碰见了这样的问题,经denny2004网友的指点,发现pl/sql developer经过设置,可以看到分区表更详细的执行计划,查询从哪个分区开始,到哪个分区结束。现把设置方法摘录如下:

plsql的explain默认是没有partition start和partition stop 需要自己添加,添加方法是在explain窗口中点击references,会出现 references 所示的窗口,然后你把partition start和partition stop添加进去,你可以把常用的都添加进去,默认的explain显示的太少,添加完成后重新运行一下就可以看到了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25016/viewspace-927844/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25016/viewspace-927844/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值