我对于分区表是一个初学者,请教各位大侠几个问题?
1:对于分区表进行查询时,在SQL语句中指定分区名,与不指定分区名,执行效率是否一致
select * from t_a where a>2 (未指定某个分区名,但查询记录在分区2内) 
select * from t_a partition p2 where a>2 (指定的查询数据所在的分区)
当t_a表中的数据量非常多时,其查询效率是否一致
2:分区表的日后维护问题
现在我遇到这样一个问题,有一个大表,我准备建立分区表,其表的记录1年约有1.2亿记录
我准备每个月分一个区(共建十三个分区,一个月一个,另一个用于MAXVALUE),用范围分区法,但过一年后,我没有很好维护方案
我想一年后,对分区表进行调整,有没有什么好的方案
(我只想建十三个分区,而且想把数据保存在当前表中)
先谢谢各位了

解决方案 »

  1.   

    1.只要在WHERE子句中用上分区键,自然会去分区中查找,可不用加partition关键字。不过就你这个例子,a>2,而不是a=2,那还是会扫描好几个分区的。2.LZ这个表是用于什么的,需要把往年数据还一直存在里面吗?可以考虑每满一年就将数据转移到另一张表中。然后在当前表中按月分区。
      

  2.   

    1 效率没有区别
    2 显然你的数据是按时间分区的,那么你明年的数据就无法再存储进前12个分区,只能存到maxvalue分区, 你又想把数据保存到当前表中,岂不自相矛盾,所以只能将之前的12个月数据转移到其他表中,新建12个新一年的分区
      

  3.   

    1.效率影响非常大,尤其是数据量大时,如果采用方法一性能将大大降低,务必在where查询条件中加入分区字段。另外设计该字段时,务必将其关联在已知条件中,不然就无法得知数据在哪个分区。如按月分区,查询某ID的详细数据,可将ID设计为20081009XXXX,从中可得知该数据在第10个分区。
    select * from table_name where ID=20081009XXXX and month=10;2.根据你的想法,可将分区表按年月分区,按年主分区,按月子分区。
    如:
    分区1:2008,01
    分区2:2008,12
    ...
    分区13:2008,maxvalue
    分区14:2009,01
    分区15:2009,02
    ...
    分区n:maxvalue,maxvalue
    预先创建几年的分区,如果超过年限,可自行手动添加分区。