2015-09-08 87 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

好運。