Глава 10. Повышение производительности
– изменение параметров планировщика, управляющих выбором порядка соедине-
ния наборов строк: использование общих табличных выражений (запросы с пред-
ложением WITH), использование фиксированного порядка соединения (параметр
join_collapse_limit = 1), запрет раскрытия подзапросов и преобразования их
в соединения таблиц (параметр from_collapse_limit = 1);
– изменение параметров планировщика, управляющих выбором метода досту-
па к данным (enable_seqscan, enable_indexscan, enable_indexonlyscan,
enable_bitmapscan) и способа соединения наборов строк (enable_nestloop,
enable_hashjoin, enable_mergejoin);
– изменение параметров планировщика, управляющих использованием ряда опе-
раций: агрегирование на основе хеширования (enable_hashagg), материализа-
ция временных наборов строк (enable_material), выполнение явной сортиров-
ки при наличии других возможностей (enable_sort).
Необходимым условием для того, чтобы планировщик выбрал правильный план, яв-
ляется наличие актуальной статистики. Если вы предполагаете, что планировщик
опирается на неактуальную статистику, можно ее принудительно обновить с помо-
щью команды ANALYZE. Например, обновить статистику для таблицы aircrafts
можно, выполнив команду
ANALYZE aircrafts;
ANALYZE
В качестве примера ситуации, в которой оптимизация запроса представляется обос-
нованной, рассмотрим следующую задачу. Предположим, что необходимо опреде-
лить степень загруженности кассиров нашей авиакомпании в сентябре 2016 г. Для
этого, в частности, требуется выявить распределение числа операций бронирования
по числу билетов, оформленных в рамках этих операций. Другими словами, это озна-
чает, что нужно подсчитать число операций бронирования, в которых был оформлен
только один билет, число операций, в которых было оформлено два билета и т. д.
Эту задачу можно переформулировать так: для каждой строки, отобранной из табли-
цы «Бронирования» (bookings), нужно подсчитать соответствующие строки в таб-
лице «Билеты» (tickets). Речь идет о строках, в которых значение поля book_ref
такое же, что и в текущей строке таблицы bookings. Буквальное следование такой
формулировке задачи приводит к получению запроса с коррелированным подзапро-
сом в предложении SELECT. Но это еще не окончательное решение. Теперь нужно
сгруппировать полученный набор строк по значениям числа оформленных билетов.
312
10.5. Оптимизация запросов
Получаем такой запрос:
Достарыңызбен бөлісу: |