Найти в Дзене
Postgres DBA

Оптимизация SQL-запросов PostgreSQL : LEFT OUTER JOIN (пример)

-- Основные индексы для фильтрации CREATE INDEX CONCURRENTLY col1x_table3_col14 ON table3 (col14); CREATE INDEX CONCURRENTLY col1x_table2_col12_desc ON table2 (col12 DESC); CREATE INDEX CONCURRENTLY col1x_table2_recipient_sender ON table2 (col7, col6); -- Индексы для условий WHERE CREATE INDEX CONCURRENTLY col1x_badges_client_col13 ON badges_client (col13); -- Составные индексы для JOIN условий CREATE INDEX CONCURRENTLY col1x_table2_action_created ON table2 (col8, col12 DESC); -- Для больших таблиц CREATE INDEX CONCURRENTLY col1x_table1_col2 ON table1 (col2); CREATE INDEX CONCURRENTLY col1x_table3_col15 ON table3 (col15); CREATE INDEX CONCURRENTLY col1x_store_col153 ON store_currency (col13); 1. Устранение Parallel Seq Scan через целевые индексы 2. Разбиение сложного запроса на логические части с CTE 3. Оптимизация условий OR через EXISTS или UNION 4. Сокращение количества JOIN за счет предварительной фильтрации 5. Использование временных таблиц для повторяющихся подзапросов
Оглавление
SQL изначально предполагался как удобный способ взаимодействия с реляционными базами данных.
SQL изначально предполагался как удобный способ взаимодействия с реляционными базами данных.

Текст SQL запроса

-2

План запроса

-3

Оптимизация SQL запроса

1. Создание стратегических индексов

-- Основные индексы для фильтрации

CREATE INDEX CONCURRENTLY col1x_table3_col14 ON table3 (col14);

CREATE INDEX CONCURRENTLY col1x_table2_col12_desc ON table2 (col12 DESC);

CREATE INDEX CONCURRENTLY col1x_table2_recipient_sender ON table2 (col7, col6);

-- Индексы для условий WHERE

CREATE INDEX CONCURRENTLY col1x_badges_client_col13 ON badges_client (col13);

-- Составные индексы для JOIN условий

CREATE INDEX CONCURRENTLY col1x_table2_action_created ON table2 (col8, col12 DESC);

2. Переписывание запроса с использованием CTE

-4

3. Альтернативный подход с материализацией

-5

4. Оптимизация структуры запроса

-6

5. Дополнительные индексы для тяжелых JOIN

-- Для больших таблиц

CREATE INDEX CONCURRENTLY col1x_table1_col2 ON table1 (col2);

CREATE INDEX CONCURRENTLY col1x_table3_col15 ON table3 (col15);

CREATE INDEX CONCURRENTLY col1x_store_col153 ON store_currency (col13);

Ключевые улучшения:

1. Устранение Parallel Seq Scan через целевые индексы

2. Разбиение сложного запроса на логические части с CTE

3. Оптимизация условий OR через EXISTS или UNION

4. Сокращение количества JOIN за счет предварительной фильтрации

5. Использование временных таблиц для повторяющихся подзапросов