ITPub博客

首页 > 数据库 > 数据库开发技术 > 在分区表上使用正确的索引来提高性能

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

原创 数据库开发技术 作者:zhang41082 时间:2019-06-13 08:48:08 0 删除 编辑
问题提出:
一个三表链接,其中都是通过主键来链接的,而且查询条件只有一个,而且这个列的选择性非常高,基本上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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2002-10-11

  • 博文量
    79
  • 访问量
    60461