Неклассические техники оптимизации запросов в PostgreSQL, или как научить слона танцевать рок-н-ролл
SQL запросы обычно оптимизируются путем добавления дополнительных индексов (иногда с минимальным переписыванием запроса), при этом оставляя основную идею запроса неизменной. Во многих случаях это не является самым эффективным методом оптимизации, и требуется полное переосмысление и переписывание запроса.
В этом докладе я представлю обзор нескольких малоизвестных и/или редкоиспользуемых техник оптимизации запросов:
- использование IOS (index-only scan) в ситуациях, где напрямую они не применимы;
- использование техники loose index scan в различных задачах;
- внесение LIMIT/OFFSET условий внутрь сложных JOIN;
- и тому подобные фокусы.
Используя эти техники, я покажу как оптимизировать популярный в реальных задачах, но очень неудобный для базы запрос вида WHERE f1 IN (LIST) ORDER BY f2 LIMIT ... OFFSET ... (простейшая лента новостей по авторам и подобные задачи).
В презентации будет представлено сравнение нескольких разных реализаций решения одной и той же задачи: прямое/простейшее решение, оптимизированная версия прямого решения без переделки идеи, реализация альтернативного алгоритма на pl/pgsql и, наконец, реализация альтернативного алгоритма в виде SQL запроса.
В качестве дополнительного бонуса станет видно, каким образом возможно сконвертировать почти любой read-only статический pl/pgsql код в обычный sql запрос.
SQL запросы обычно оптимизируются путем добавления дополнительных индексов (иногда с минимальным переписыванием запроса), при этом оставляя основную идею запроса неизменной. Во многих случаях это не является самым эффективным методом оптимизации, и требуется полное переосмысление и переписывание запроса.
В этом докладе я представлю обзор нескольких малоизвестных и/или редкоиспользуемых техник оптимизации запросов:
- использование IOS (index-only scan) в ситуациях, где напрямую они не применимы;
- использование техники loose index scan в различных задачах;
- внесение LIMIT/OFFSET условий внутрь сложных JOIN;
- и тому подобные фокусы.
Используя эти техники, я покажу как оптимизировать популярный в реальных задачах, но очень неудобный для базы запрос вида WHERE f1 IN (LIST) ORDER BY f2 LIMIT ... OFFSET ... (простейшая лента новостей по авторам и подобные задачи).
В презентации будет представлено сравнение нескольких разных реализаций решения одной и той же задачи: прямое/простейшее решение, оптимизированная версия прямого решения без переделки идеи, реализация альтернативного алгоритма на pl/pgsql и, наконец, реализация альтернативного алгоритма в виде SQL запроса.
В качестве дополнительного бонуса станет видно, каким образом возможно сконвертировать почти любой read-only статический pl/pgsql код в обычный sql запрос.