如何针对 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 优化此查询的主要内容,如果未能解决你的问题,请参考以下文章

查询优化 [Oracle]

一个棘手的删除查询的 Oracle 查询优化

Oracle 查询性能优化

Oracle查询速度优化问题

如何提高oracle的查询速度

oracle查询的查询优化