linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-30-1-reading-explain

lesson ── postgres-labs ── ~24 мин ── 4 шагов

Расследуй плохой запрос и почини до Index Scan

Возьмём запрос с ::date-кастом, который убивает индекс, прочитаем EXPLAIN ANALYZE и починим переписыванием на диапазон. Перед фиксом предскажи, сменится ли Seq Scan на индексный доступ. Запусти psql во вкладке client.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Подготовь таблицу событий с индексом по времени

    sql
    CREATE TABLE ev AS
      SELECT g AS id, now() - (g || ' minutes')::interval AS at
      FROM generate_series(1, 200000) g;
    CREATE INDEX ON ev(at);
    ANALYZE ev;
    подсказка

    Индекс по at - то, что каст потом сделает бесполезным.

    ✓ Таблица и индекс по at готовы.

  2. 02

    Плохой запрос: каст убивает индекс

    sql
    EXPLAIN ANALYZE SELECT * FROM ev WHERE at::date = current_date;

    Заметь Seq Scan: at::date оборачивает колонку в функцию, и индекс по at не подходит. Посмотри расхождение estimated/actual rows.

    подсказка

    Функция или каст над индексированной колонкой делает условие не-sargable.

    ✓ Seq Scan - каст обернул колонку, индекс не использован.

  3. 03

    Перепиши на диапазон - индекс оживает

    Не трогай колонку, сравнивай её саму:

    sql
    EXPLAIN ANALYZE SELECT * FROM ev
    WHERE at >= current_date AND at < current_date + 1;

    Условие стало sargable - планировщик берёт индекс (Index или Bitmap Scan). Предскажи тип узла перед проверкой.

    подсказка

    Диапазон по самой колонке at позволяет использовать индекс.

    ✓ Индексный доступ вернулся - условие стало sargable.

  4. 04

    Сравни BUFFERS двух вариантов

    sql
    EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM ev
    WHERE at >= current_date AND at < current_date + 1;

    В строке Buffers видно shared hit/read. Sargable-вариант трогает куда меньше страниц, чем Seq Scan по всей таблице.

    подсказка

    shared read - чтения с диска, shared hit - попадания в кеш.

    ✓ Видно BUFFERS - sargable-запрос читает меньше страниц.

Что ты узнал

EXPLAIN ANALYZE кладёт факт рядом с оценкой; расследование - поиск узла с наибольшим расхождением rows. Типовой виновник - каст или функция над индексированной колонкой: условие становится не-sargable и уходит в Seq Scan. Лечение - переписать на диапазон по самой колонке. BUFFERS показывает, упор в диск или в вычисления.

команды

  • EXPLAIN (ANALYZE, BUFFERS) SELECT ...;факт, оценка и страницы рядом
  • WHERE at >= d AND at < d + 1sargable-диапазон вместо at::date = d

концепции

  • · расхождение estimated и actual rows - главный след корня проблемы
  • · actual time/rows даны на один loop - умножай на loops
  • · каст/функция над колонкой убивает индекс (не-sargable)
  • · BUFFERS отделяет упор в диск от упора в вычисления

← предыдущая

Понаблюдай порядок соединений и кеш плана

следующая →

Найди нужный метод доступа через каталог

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки