Как оптимизировать этот запрос для Oracle - PullRequest
0 голосов
/ 13 октября 2018

Я изучаю оптимизацию запросов, используя некоторые структуры, такие как индекс, кластер индекса, кластер хэша.У меня есть таблица Customer и Booking.Есть 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 ....Однако, когда я пытаюсь следовать этому правилу для вышеупомянутых запросов, он не имеет каких-либо улучшений производительности.

Например, для первого запроса я создаю индекс для обоих столбцов CID таблиц BOOKING и CUSTOMER.Я также создаю индекс по столбцу SEAT_PRICE таблицы BOOKING.Сценарии, которые я запускаю, выполняются следующим образом:

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

Обратите внимание, что я создаю файл трассировки для просмотра статистики запроса.Я запускаю запрос для создания файла трассировки перед созданием этих индексов.После создания этих индексов я снова запускаю его, чтобы создать другой файл трассировки.Однако новый файл трассировки не показывает каких-либо улучшений во времени, ЦП, истекшем времени, запросах и т. Д.У него даже худшая производительность.

Может кто-нибудь помочь мне с этим, пожалуйста?Это действительно расстраивает меня, потому что я не понимаю почему, я следую точному правилу.Я сделал Google, но безрезультатно.

1 Ответ

0 голосов
/ 13 октября 2018

Вы можете использовать составной индекс:

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