oracle分区注意点,oracle查分区表的一些注意事项

昨天有个同事找我看了一段SQL,说是很慢,我首先看了看执行计划,发现COST很大,但是同时我也发现分区读取的有很大的问题。表示这样的:

create table test1

(

day_id number

)

partition by range(day_id)

(

partition part_0 values less than(20130228),

partition part_1 values less than(20130301),

partition part_2 values less than(20130302),

partition part_3 values less than(20130303),

partition part_4 values less than(20130304),

partition part_5 values less than(20130305),

partition part_6 values less than(20130306)

)

表中的数据如下:

a8c17ec65d0681552ddd2566dcf1a347.png

查询是这样子的:

select * from test1 where substr(day_id,1,6) = 201302

执行计划是这样的:

3d40da1fc8826661abc657f12b75f9e7.png

可以看出来,一口气把所有的分区都读上了,但是按照我的想法,应该是只读取part_0和part_1这两个分区。后来我把这个SQL改成了这样:

select * from test1 where day_id between 20130227 and 20130228

这个时候的执行计划就是这样的:

c0a9b633d9aa909636cb437c08bc0b7f.png

这样就好了,只读取了需要的分区,这样子查询效率也有了很大的提高。生产系统中一天会有3GB的数据,所以如果按照第一个SQL写,那么就会读到这个表所有的分区,数据量就非常可观了,如果只读取自己需要的一个月的分区,就要小多了,COST也降低了很多。

我记得以前写过一个不能用到索引的情况:http://www.cnblogs.com/wingsless/archive/2011/11/19/2255647.html。昨天遇到这个情况以后发现分区也有这样那样的限制,还是原来写的那句话,一定要慎之又慎的写SQL。http://www.cnblogs.com/wingsless/archive/2013/03/09/2951618.html。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值