Что такое Sequential Scan (seq scan) в базах данных?

«Что такое Sequential Scan (seq scan) в базах данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Sequential Scan (последовательное сканирование, seq scan) — это метод доступа к данным в СУБД, при котором система читает все строки таблицы подряд, от первой до последней, для выполнения запроса (например, SELECT * FROM table или SELECT ... WHERE без подходящего индекса).

Как это работает и когда используется:

  1. Полное сканирование: СУБД загружает страницы данных таблицы одну за другой в буферный кэш и проверяет каждую строку на соответствие условию WHERE.
  2. Основные случаи использования:
    • Запросы, которые должны обработать большую часть (> ~5-10%) строк таблицы.
    • Отсутствие подходящего индекса для столбцов в условии WHERE.
    • Необходимость прочитать все столбцы строки (индексное сканирование часто требует дополнительного обращения к таблице за остальными данными).
    • Принудительное указание SET enable_indexscan = off; или аналогичных настроек.

Пример и сравнение:

-- Запрос, который, скорее всего, вызовет seq scan, если таблица большая:
SELECT * FROM orders WHERE total_amount > 100;

-- Запрос, который может использовать индекс (если он есть на `customer_id`):
SELECT * FROM orders WHERE customer_id = 12345;

Производительность:

  • Плюс: Эффективно для небольших таблиц или когда нужно прочитать большую часть данных.
  • Минус: Медленно для больших таблиц при выборке небольшого числа строк, так как требует чтения всего объема данных.

Оптимизация: Чтобы избежать seq scan в нежелательных случаях, создавайте индексы на часто используемых в условиях WHERE и JOIN столбцах.