如何为Oracle优化此查询

时间:2018-10-13 14:42:00

标签: sql oracle query-performance

我正在通过使用一些结构来学习查询优化,例如索引,索引簇,哈希簇。我有一张桌子客户和预订。我需要优化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,经过时间,查询等方面均没有任何改善。它甚至具有最差的性能。

有人可以帮我吗?由于我不明白为什么,我确实很沮丧,我严格遵守规则。我做了谷歌,但无济于事。

1 个答案:

答案 0 :(得分:0)

您可以使用复合索引:

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);