我正在通过使用一些结构来学习查询优化,例如索引,索引簇,哈希簇。我有一张桌子客户和预订。我需要优化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,经过时间,查询等方面均没有任何改善。它甚至具有最差的性能。
有人可以帮我吗?由于我不明白为什么,我确实很沮丧,我严格遵守规则。我做了谷歌,但无济于事。
答案 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);