我有一张大表,有70多个字段,其中一个字段是recvtime时间字段(整型时间)。因为这张表的数据量很大,所以考虑使用partition进行分区,以recvtime字段,按月分区,语句如下:
CREATE TABLE t_a
(
   id                 VARCHAR2 (16 BYTE) NOT NULL,
   recvtime           INTEGER NOT NULL,
   ipaddress          integer,
   ...
)
PARTITION BY RANGE (RECVTIME)
   (PARTITION t_a_201109
       VALUES LESS THAN (1317398400),                             --2011-10-01
    PARTITION t_a_201110
       VALUES LESS THAN (1320076800),
    PARTITION t_a_201111
       VALUES LESS THAN (1322668800),  
    PARTITION t_a_residual
       VALUES LESS THAN (maxvalue))
/其中recvtime字段创建了索引,id是主键。问题如下:
目前该表中有500万数据,我想要查询10月10日到10月17日的数据。在没有创建分区的同样结构的表中,查询速度大概33秒(从500万数据中查询出6万),而在创建了分区的表中,查询速度却要需要50秒。
1.为什么会这样?创建分区的表的查询速度应该更快啊?
2.分区表的查询语句:
SELECT   * 
  FROM   t_a PARTITION (t_a_201110)
 WHERE       recvtime >= 1318176000
         AND recvtime < 1318780800
         AND ...(其他条件)
这个语句和不添加PARTITION (t_a_201110)的查询语句,在查询性能查询的执行过程上有区别吗?需要人为指定查询的分区吗?还是oracle能够自动根据recvtime的条件判断需要查询的分区呢?ps:我是在工作机上做的测试(笔记本),xp系统,oracle11g麻烦高手指点,谢谢
               

解决方案 »

  1.   

    正常来讲分区对用户来讲应该是透明的。
    可以试一下在查询时指定分区,再测试一下时间。SELECT * FROM 表名 PARTITION(分区名);
      

  2.   

    指定分区和不指定分区的速度差不多,但是都比没有分区的表慢。
    如果查询的时间段刚好是一个月的话,即recvtime的范围是10月1日-10月30日,那么创建分区的表的查询速度就明显比没有分区的表的速度快,为什么??
      

  3.   

    嗯。我之前在recvtime上用的是局部索引,后来改成了全局索引,速度就上来了。看了执行计划,局部索引的内存排序不不分区表的查询多很多,我想是不是在这里浪费了很多时间。基本算是解决,不过还是有很多不理解的地方,对oracle的了解还需要继续加深。