Жизненный цикл запроса и планировщик

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

Amy McCarty

Instructor

Базовый жизненный цикл запроса

Система Шаги на стороне клиента Процессы на стороне сервера
1 Парсер Отправка запроса в базу данных Проверяет синтаксис. Переводит SQL во внутреннее представление на основе системных правил.
2 Планировщик и оптимизатор Оценка и оптимизация задач запроса Использует статистику БД для построения плана. Вычисляет стоимость и выбирает оптимальный план.
3 Исполнитель Возврат результатов запроса Выполняет запрос согласно плану.
Оптимизация запросов в PostgreSQL

Планировщик и оптимизатор запросов

Реагирует на изменения структуры SQL

  • Строит деревья планов
    • Узлы соответствуют шагам
    • Визуализация с помощью EXPLAIN
  • Оценивает стоимость каждого дерева
    • Статистика из pg_tables
    • Оптимизация по времени
1 Plan tree: https://www.postgresql.org/docs/current/querytree.html
Оптимизация запросов в PostgreSQL

Статистика из pg_tables

SELECT * FROM pg_class
WHERE relname = 'mytable'
-- sample of output columns
| relname | relhasindex |
SELECT * FROM pg_stats
WHERE tablename = 'mytable'
-- sample of output columns
null_frac | avg_width | n_distinct | 
  • Индексы столбцов
  • Подсчёт значений NULL
  • Ширина столбца
  • Уникальные значения
Оптимизация запросов в PostgreSQL

EXPLAIN

 

  • Отображение плана запроса
  • Шаги и оценки стоимости
    • Запрос не выполняется

 

  • Последовательное сканирование таблицы cheeses
  • Оценки стоимости и размера

 

EXPLAIN
SELECT * FROM cheeses

 

Seq Scan on cheeses 
(cost=0.00..10.50 rows=5725 width=296)
Оптимизация запросов в PostgreSQL

EXPLAIN: сканирование

 

  • Шаг плана запроса
  • Возвращает строки

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

 

  • Seq Scan : сканирование всех строк таблицы
Оптимизация запросов в PostgreSQL

EXPLAIN: стоимость

 

  • Безразмерная величина
  • Сравнивайте структуры с одинаковым выводом
    • Не следует сравнивать запросы с разным выводом

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

 

 

  • 0.00.. : время запуска
  • ..10.50 : общее время

  • общее время = время запуска + время выполнения

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

EXPLAIN: размер

 

  • Оценки размера

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

  • rows : количество строк, которые нужно просмотреть
  • width : ширина строки в байтах
Оптимизация запросов в PostgreSQL

EXPLAIN с условием WHERE

EXPLAIN
SELECT * FROM cheeses WHERE species IN ('goat','sheep') 
Seq Scan on cheeses (cost=0.00..378.90 rows=3 width=118)
 -> Filter: (species = ANY ('{"goat","sheep"}'::text[]))
  • Читается снизу вверх
    • Шаг 1: фильтрация
    • Шаг 2: последовательное сканирование
  • Условие WHERE
    • Сокращает количество строк, но увеличивает общую стоимость
Оптимизация запросов в PostgreSQL

EXPLAIN с индексом

EXPLAIN
SELECT * FROM cheeses WHERE species IN ('goat','sheep') -- index on species column
Bitmap Index Scan using species_idx on cheeses (cost=0.29..12.66 rows=3 width=118)
  Index Cond: (species = ANY ('{"goat","sheep"}'::text[]))
  • Шаг 1: Bitmap Index Scan
    • Index Cond описывает шаг сканирования
  • ИНДЕКС
    • Стоимость запуска выросла с 0
    • Общая стоимость снизилась с 379
Оптимизация запросов в PostgreSQL

Давайте потренируемся!

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

Preparing Video For Download...