2016-12-14 95 views
0

需要幫助查詢性能。Oracle性能問題

我有一個表加入一個視圖,它需要7秒鐘才能得到結果。但是當我在視圖上選擇查詢時,我會在1秒內得到結果。 我已經在表A上創建了索引。但是查詢沒有任何改進。

SELECT 
    ITEM_ID, BARCODE, CONTENT_TYPE_CODE, DEPARTMENT, DESCRIPTION, ITEM_NUMBER, FROM_DATE, 
    TO_DATE, CONTACT_NAME, FILE_LOCATION, FILE_LOCATION_UPPER, SOURCE_LOCATION, 
    DESTRUCTION_DATE, SOURCE, LABEL_NAME, ARTIST_NAME, TITLE, SELECTION_NUM, REP_IDENTIFIER, 
    CHECKED_OUT 
FROM View B, 
    table A 
where B.item_id=A.itemid 
    and status='VALID' 
    AND session_id IN ('naveen13122016095800') 
ORDER BY item_id,barcode; 

CREATE TABLE A 
(
    ITEMID  NUMBER, 
    USER_NAME VARCHAR2(25 BYTE), 
    CREATE_DATE DATE, 
    SESSION_ID VARCHAR2(240 BYTE), 
    STATUS  VARCHAR2(20 BYTE) 
) 

CREATE UNIQUE INDEX A_IDX1 ON A(ITEMID); 
CREATE INDEX A_IDX2 ON A(SESSION_ID); 
CREATE INDEX A_IDX3 ON A(STATUS);' 
+0

請告訴我們你的表結構 –

+0

還包括安劍錚,卓傑表和視圖二者的查詢執行計劃。 – JSapkota

+0

CREATE TABLE甲 ( ITEMID NUMBER, USER_NAME VARCHAR2(25 BYTE), CREATE_DATE DATE, SESSION_ID VARCHAR2(240 BYTE), STATUS VARCHAR2(20 BYTE) ) – Mahi

回答

1

查詢加入表的視圖比單獨查詢視圖要慢嗎?這並不奇怪,是嗎?

無論如何,在字段上創建單獨的索引沒有什麼意義。 DBMS將選擇一個索引(如果有的話)來訪問表。你可以嘗試一個組成指數:

CREATE UNIQUE INDEX A_IDX4 ON A(status, session_id, itemid); 

但是,當它在簡單地讀取整個表看到這樣的優點的DBMS將仍然只使用這個指標。這意味着,如果DBMS希望無論如何都必須讀取大量記錄,則不會通過索引間接訪問它們。

在涉及您的查詢最後兩個備註:

  • 不要使用那些過時的以逗號分隔的連接。與明確的ANSI連接相比,它們的可讀性更差並且更容易出錯(FROM View B JOIN table A ON B.item_id = A.itemid)。
  • 在查詢中使用多個表或視圖時,對所有列使用限定符(and A.status='VALID' ...)。

更新:我看到現在,你是不是從表中選擇任何列,那麼爲什麼加入它呢?看起來你只是在查看錶中是否存在記錄,所以請相應地使用EXISTSIN。 (這可能不是使其更快,但至少很多更具可讀性。)

SELECT 
    ITEM_ID, BARCODE, CONTENT_TYPE_CODE, DEPARTMENT, DESCRIPTION, ITEM_NUMBER, FROM_DATE, 
    TO_DATE, CONTACT_NAME, FILE_LOCATION, FILE_LOCATION_UPPER, SOURCE_LOCATION, 
    DESTRUCTION_DATE, SOURCE, LABEL_NAME, ARTIST_NAME, TITLE, SELECTION_NUM, REP_IDENTIFIER, 
    CHECKED_OUT 
FROM View 
WHERE itemid IN 
(
    SELECT itemid 
    FROM A 
    WHERE status = 'VALID' 
    AND session_id IN ('naveen13122016095800') 
) 
ORDER BY item_id, barcode;