Пример 1.
Поиск по электронной почте простым запросом занимает
4,5 секунды:
SELECT DISTINCT b.booking_id, b.booking_ref, b.booking_name, b.email
FROM booking b
WHERE lower(email) LIKE 'lawton52%'
Выполнение функции занимает 13 секунд:
SELECT * FROM select_booking ('lawton52', NULL, NULL, NULL, NULL)
Пример 2.
Поиск по электронной почте и идентификатору рейса.
Выполнение запроса занимает 150 мс:
SELECT DISTINCT b.booking_id, b.booking_ref, b.booking_name, b.email
FROM booking b
JOIN booking_leg bl USING (booking_id)
WHERE lower(email) LIKE 'lawton52%'
AND flight_id = 27191
При этом выполнение функции занимает 102 мс:
SELECT * FROM select_booking ('lawton52', NULL, NULL, NULL, 27191)
Пример 3.
Поиск по электронной почте, аэропорту вылета и аэропорту
прибытия.
Выполнение запроса занимает 200 мс:
SELECT DISTINCT b.booking_id, b.booking_ref, b.booking_name, b.email
FROM booking b
JOIN booking_leg bl USING (booking_id)
JOIN flight f USING (flight_id)
WHERE lower(email) LIKE 'lawton52%'
AND departure_airport = 'ORD'
AND arrival_airport = 'JFK'
Выполнение функции с теми же параметрами занимает 910 мс:
SELECT * FROM select_booking ('lawton52', 'ORD', 'JFK', NULL, NULL)
Пример 4.
Поиск по электронной почте, аэропорту вылета, аэропорту
прибытия и дате вылета.
Запрос выполняется за 95 мс:
Использование динамического SQL для гибкости
233
SELECT DISTINCT b.booking_id, b.booking_ref, b.booking_name, b.email
FROM booking b
JOIN booking_leg bl USING (booking_id)
JOIN flight f USING (flight_id)
WHERE lower(email) LIKE 'lawton52%'
AND departure_airport = 'ORD'
AND arrival_airport = 'JFK'
AND scheduled_departure BETWEEN '2020-07-30' AND '2020-07-31'
Выполнение функции занимает одну секунду:
SELECT * FROM select_booking ('lawton52', 'ORD', 'JFK', '2020-07-30', NULL)
Пример 5.
Поиск по электронной почте и дате вылета.
Выполнение запроса занимает 10 секунд:
SELECT DISTINCT b.booking_id, b.booking_ref, b.booking_name, b.email
FROM booking b
JOIN booking_leg bl USING (booking_id)
JOIN flight f USING (flight_id)
WHERE lower(email) LIKE 'lawton52%'
AND scheduled_departure BETWEEN '2020-07-30' AND '2020-07-31'
Выполнение функции занимает 13 секунд.
SELECT * FROM select_booking ('lawton52', NULL, NULL, '2020-07-30', NULL)
Пример 6.
Поиск по идентификатору рейса.
Выполнение запроса занимает 130 мс:
SELECT DISTINCT b.booking_id, b.booking_ref, b.booking_name, b.email
FROM booking b
JOIN booking_leg bl USING (booking_id)
WHERE flight_id = 27191
Выполнение функции занимает 133 мс:
SELECT * FROM select_booking (NULL, NULL, NULL, NULL, 27191)
В действительности, как мы обсуждали ранее, время выполнения для раз-
личных вызовов функций может оказаться даже больше, если первые вызовы
функции в текущем сеансе приводят к плану, неоптимальному для последу-
ющих выполнений. Экспериментируя с этой функцией, нам удалось найти
последовательность вызовов, из-за которой последний пример выполнялся
в течение трех минут.
Как решить эту проблему? Так же, как в предыдущем примере, можно
написать функцию, которая динамически создает запрос в зависимости от
передаваемых параметров. Запрос будет планироваться заново перед каж-
дым выполнением.
Исходный код новой функции представлен в лис тинге 12.12.
Do'stlaringiz bilan baham: |