簡體   English   中英

如何為Oracle優化此查詢

[英]How to optimize this query for Oracle

我正在通過使用一些結構(例如索引,索引集群,哈希集群)來學習查詢優化。 我有一張桌子客戶和預訂。 我需要優化2個查詢

查詢1:

 SELECT BOOKING.BID, CUSTOMER.CID, BOOKING.SEAT_PRICE
    FROM BOOKING, CUSTOMER
    WHERE BOOKING.CID= CUSTOMER.CID
    AND BOOKING.SEAT_PRICE>200;

查詢2:

SELECT BOOKING.BID, CUSTOMER.CID
FROM BOOKING, CUSTOMER
WHERE BOOKING.CID= CUSTOMER.CID
AND CUSTOMER.CID>1900;

從理論上講,為了提高性能,我們需要對WHERE,JOIN,ORDER BY ...子句中的所有謂詞進行索引/索引簇/哈希簇。 但是,當我嘗試對上述查詢遵循該規則時,它沒有任何性能改進。

例如,對於第一個查詢,我在BOOKING表和CUSTOMER表的CID列上都創建了索引。 我還在BOOKING表的SEAT_PRICE列上創建索引。 我運行的腳本如下:

CREATE INDEX BOOKING_SEAT_PRICE ON BOOKING(SEAT_PRICE);
CREATE INDEX BOOKING_CID ON BOOKING(CID);
CREATE INDEX CUSTOMER_CID ON CUSTOMER(CID);

請注意,我創建跟蹤文件以查看查詢的統計信息。 在創建這些索引之前,我運行查詢以創建跟蹤文件。 創建完這些索引后,我再次運行它以創建另一個跟蹤文件。 但是,新的跟蹤文件在時間,CPU,經過時間,查詢等方面均沒有任何改善。 它甚至具有最差的性能。

有人可以幫我嗎? 由於我不明白為什么,我確實很沮喪,我嚴格遵守規則。 我做了谷歌,但無濟於事。

您可以使用復合索引:

SELECT BOOKING.BID, CUSTOMER.CID, BOOKING.SEAT_PRICE
FROM BOOKING 
JOIN CUSTOMER  -- explicit JOIN
  ON BOOKING.CID = CUSTOMER.CID
WHERE BOOKING.SEAT_PRICE>200;

CREATE INDEX BOOKING_SEAT_PRICE_CID ON BOOKING(SEAT_PRICE, CID);
CREATE INDEX CUSTOMER_CID ON CUSTOMER(CID);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM