+ -
当前位置:首页 → 问答吧 → 关于oracle分区表的查询性能问题

关于oracle分区表的查询性能问题

时间:2011-11-09

来源:互联网

我有一张大表,有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

麻烦高手指点,谢谢
 

作者: wwll123   发布时间: 2011-11-09

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

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

作者: LuiseRADL   发布时间: 2011-11-09

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

作者: wwll123   发布时间: 2011-11-09

热门下载

更多