在Oracle中避免完整的表扫描

时间:2015-09-08 16:54:47

标签: sql oracle11g

我有一个查询,它从整个表中获取包含数千个条目的最后30行。表很大,因此数据库查询执行时间超过5分钟。如何避免对表进行全表扫描,以便仅扫描最后几行。我正在使用Oracle 11g

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是设备的系统类型,MODEL是设备名称 DD和MODEL是表的组合主键 TABLE包含数千个条目,并包含2010年的数据 我只需要获取上个月的数据

1 个答案:

答案 0 :(得分: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到&#39;新&#39; DVCE_TAB,然后删除原始表并重命名“&#39; new&#39;表格DVCE_TAB

祝你好运。