如何针对 Oracle 优化此查询
Posted
技术标签:
【中文标题】如何针对 Oracle 优化此查询【英文标题】:How to optimize this query for Oracle 【发布时间】:2018-10-13 14:41:59 【问题描述】:我正在学习使用索引、索引簇、哈希簇等结构进行查询优化。我有一张桌子客户和预订。我需要优化 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、运行时间、查询等方面没有任何改进。它的性能甚至最差。
谁能帮我解决这个问题?这真的让我很沮丧,因为我不明白为什么,我严格遵守规则。我用谷歌搜索但无济于事。
【问题讨论】:
必须检查执行计划才能确定,但对于第一个,可能只使用座位价格和 customer.cid 的索引。第二个可能会同时使用两个 cid。 【参考方案1】:你可以使用复合索引:
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);
【讨论】:
感谢@Lukasz Szozda,复合索引的工作方式与以前相同。可能我需要学习阅读跟踪文件并解释计划。你介意帮我解决关于跟踪文件的新问题吗?***.com/questions/52817309/…以上是关于如何针对 Oracle 优化此查询的主要内容,如果未能解决你的问题,请参考以下文章