日期:2014-05-17  浏览次数:20909 次

关于oracle分区表的查询性能问题
我有一张大表,有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

麻烦高手指点,谢谢
 

------解决方案--------------------
正常来讲分区对用户来讲应该是透明的。
可以试一下在查询时指定分区,再测试一下时间。
SQL code

SELECT * FROM 表名 PARTITION(分区名);

------解决方案--------------------
如果数据分布在多个分区,涉及数据的递归调用问题,比不分区还要慢。