基于linux下的oracle 数据库,crbt_bill表非常大,现想对齐进行表水平分区,大概的思路是,按时间分区,每个月一个分区,一次性规划5年的分区,但是目前还存在一些几点问题:
1、 分区键如何选取?
因为在对该表进行数据提取 时候,用到了2个时间,如果是creat_time、还有一个是
insert_time,这样无论选取哪个时间作为分区键,都会造成一部分数据需要跨分区查询。
目前打算以insert_time作为 分区键。2、 如何才能在正确的分区中查询?
在不修改相关过程的情况下,如何才能将查询限制在2个分区(上面已经提到,无论如何都会跨2个分区),而不会全表扫描。虽然可以通过指定分区进行查询,但是如果在不修改查询代码的情况下,是不是可以通过索引达到目的呢?索引该如何建?
例如select* from crbt_bill where insert_time >=to_date(’2013-01-01 00:00:00’,'yyyy-mm-dd hh24:mi:ss' and insert_time < to_date(’2013-02-01 00:00:00’,'yyyy-mm-dd hh24:mi:ss' 可以智能的匹配到201301 分区查询。刚刚学习oracle 有些东西还不懂,多谢~

解决方案 »

  1.   

    1.目前打算以insert_time作为 分区键。
    可以的,只要有一个标准即可。都 行。
    2.这样是字符串比较,效率不高。
    你不用日期戳吗?
    还是,你也可用主键比较啊
    id>44,之类的
    我的序列与时间同步,即,日期早,序列小,后者,则大。
      

  2.   

    1,这2个字段有一定的差异,如果数据量很大,你可以按照日分区,然后新增一个data_date字段作为分区字段,看是否能根据这个字段作为查询条件???2. 我这边的项目在自己的数据仓库里面都是转成字符类型来比较。日期类型不同数据库格式不一。字符比较起来方便。
      

  3.   

    感谢2位的回复,1楼说的,用ID分区是不行的,必须以时间.2楼说增加一个字段,这样就需要修改过程了,因为有些过程是用select * from ... 这样的
    现在我的主要问题是,像在不修改过程和应用程序和表结构的情况下,怎么能让查询根据我的现有条件,匹配分区.
      

  4.   

    虽然不了解你们那边的规范,不过使用select * 来查询的话,Oracle会先把*解析成每个字段,然后再查询。虽然看不出来效率上有什么影响,不过建议还是写上具体的字段名字为好。我们这边的话单,有时200多个字段一样没有用*来查询。像你这种情况应该是避免不了的。跨分区查询我也经常碰到。
      

  5.   

    select* from crbt_bill where insert_time >=to_date(’2013-01-01 00:00:00’,'yyyy-mm-dd hh24:mi:ss' and insert_time < to_date(’2013-02-01 00:00:00’,'yyyy-mm-dd hh24:mi:ss' 其他的都不讨论了,就是这个语句,怎么可以让它 只在201301分区里面查而不会扫描其他分区
      

  6.   


    不知道可不可以加hint的方式。你可以看看
      

  7.   

    指定分区名 :select* from crbt_bill partition (分区名) where insert_time >=to_date(’2013-01-01 00:00:00’,'yyyy-mm-dd hh24:mi:ss' and insert_time < to_date(’2013-02-01 00:00:00’,'yyyy-mm-dd hh24:mi:ss' 
    oracle 自身会根据你的语句判断最优的处理过程。不需要你担心分区的问题。