Життєвий цикл запиту та планувальник

Покращення продуктивності запитів у PostgreSQL

Amy McCarty

Instructor

Базовий життєвий цикл запиту

Система Кроки front end Процеси back end
1 Parser Надішліть запит до бази даних Перевіряє синтаксис. Перекладає SQL у зручніший для комп'ютера синтаксис за системними правилами.
2 Planner & Optimizer Оцінює та оптимізує завдання запиту Використовує статистики бази для створення плану запиту. Обчислює вартість і обирає найкращий план.
3 Executor Повертає результати запиту Виконує запит за планом.
Покращення продуктивності запитів у 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'
-- приклад вихідних стовпців
| relname | relhasindex |
SELECT * FROM pg_stats
WHERE tablename = 'mytable'
-- приклад вихідних стовпців
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: Filter
    • Крок 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 пояснює крок сканування
  • INDEX
    • Час підготовки зріс з 0
    • Загальна вартість зменшилась з 379
Покращення продуктивності запитів у PostgreSQL

Давайте потренуємось!

Покращення продуктивності запитів у PostgreSQL

Preparing Video For Download...