Ответ
Sequential Scan (последовательное сканирование, seq scan) — это метод доступа к данным в СУБД, при котором система читает все строки таблицы подряд, от первой до последней, для выполнения запроса (например, SELECT * FROM table или SELECT ... WHERE без подходящего индекса).
Как это работает и когда используется:
- Полное сканирование: СУБД загружает страницы данных таблицы одну за другой в буферный кэш и проверяет каждую строку на соответствие условию
WHERE. - Основные случаи использования:
- Запросы, которые должны обработать большую часть (> ~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 столбцах.
Ответ 18+ 🔞
А, ну это же классика, блядь! Sequential Scan, он же просто «последовательное сканирование» — это когда твоя база данных, как последний алкаш в библиотеке, начинает читать всё подряд, от первой страницы до последней, чтобы найти нужные строчки.
Как это, блядь, работает и когда наступает этот пиздец:
- Полный проёб: Система тупо грузит страницы таблицы одну за другой в кэш и честно, строчка за строчкой, сверяет: «А ты подходишь под условие WHERE? А ты?». Никакой хитрожопости, один махровый брутализм.
- Когда это случается, ёпта:
- Когда запросу надо выгрести огромную часть таблицы (скажем, больше 5-10%). Зачем прыгать по индексам, если можно взять всё оптом, блядь?
- Когда нет подходящего индекса, сука. Ну а что ты хотел? База — не телепат, искать негде.
- Когда нужны ВСЕ столбцы из строки. Индекс часто даёт только адресок, а потом всё равно приходится идти в саму таблицу — иногда проще сразу её всю прочитать, чем метаться.
- Когда какой-то умник накрутил настройки вроде
SET enable_indexscan = off;и теперь система, как дура, обязана читать всё подряд. Ёперный театр!
Смотри, вот наглядный пиздец:
-- Этот запрос почти наверняка запустит seq scan на большой таблице. Потому что "> 100" — это дохуя строк может быть.
SELECT * FROM orders WHERE total_amount > 100;
-- А вот этот уже может взять индекс (если он, конечно, есть на customer_id). Потому что ищем одного конкретного клиента.
SELECT * FROM orders WHERE customer_id = 12345;
Что по скорости, бля?
- Плюс: Для мелких таблиц или когда нужно выдрать овердохуища данных — это самый эффективный способ, хуй с горы. Быстрее просто прочитать всё, чем умничать.
- Минус: А вот для здоровенной таблицы, где нужно 5 строчек, а прочитать придётся миллионы — это просто пиздец и агония. Терпения ноль ебать, пока всё отсканирует.
Как не облажаться: Чтобы система не тупила и не читала всё подряд, когда не надо — создавай индексы, блядь! На те столбцы, по которым часто ищешь (WHERE) или соединяешь таблицы (JOIN). Тогда база будет не как мартышлюшка, а как хитрая жопа, прыгать по нужным местам.