我有一个查询,它从整个表中获取包含数千个条目的最后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年的数据 我只需要获取上个月的数据
答案 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
。
祝你好运。