2015-09-08 68 views
1

我有一个查询从整个表中提取最后30行,其中包含数千个条目。该表很大,因此数据库查询需要超过5分钟才能执行。如何避免表上的全表扫描,以便它只扫描最后几行。我使用Oracle 11g避免在Oracle中进行全表扫描

SELECT DD,MODEL,CNT,SYS 
    FROM DVCE_TAB 
    WHERE DD >= TO_DATE('2015-08-09','YYYY-MM-DD') 
    AND DD <= TO_DATE('2015-09-08','YYYY-MM-DD') 
    AND SYS IN ('00','01') 

DD是日期,SYS是设备的系统类型和型号设备 DD的名称和型号是表 台复合主键包含的条目成千上万有数据从2010年 我只取最后几个月的数据

+0

什么是您的SQL查询? – imtheman

+0

从表中选择DD,COL2,COL3 DD> ='2015-08-09'AND <='2015-09-08'AND SYS IN('00','01') TABLE包含数千个条目并且有来自2010年的数据我只需要获取上个月的数据 – user1951344

+2

请编辑您的问题,并在DVCE_TAB中包含列的定义以及在DVCE_TAB上定义的任何索引。谢谢。 –

回答

1

一些想法浮现在脑海中:

1)定义的DD和SYS列的索引:

CREATE INDEX DVCE_TAB_1 
    ON DVCE_TAB (DD, SYS); 

你可能需要添加索引后收集表统计信息:

BEGIN 
    DBMS_STATS.GATHER_TABLE_STATS(ownname => 'YOUR_SCHEMA_NAME', 
           tabname => 'DVCE_TAB'); 
END; 

这可能是你所需要的,但如果需要的话,你可以随时...

2)在DD分区DVCE_TAB柱。

CREATE TABLE DVCE_TAB 
    (...column definitions...) 
    PARTITION BY RANGE (DD) 
    INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
    PARTITION DVCE_TAB_P1 VALUES LESS THAN (TO_DATE('01-01-2000', 'DD-MM-YYYY'))); 

要做到这一点,你可能需要实际创建一个不同名称的新表,从“老” DVCE_TAB复制所有的现有数据,以“新” DVCE_TAB,然后删除原始表和重命名'新'表DVCE_TAB

好运。