[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-bazy-dannykh-kogda-polnoe-skanirovanie-nabora-dannykh-vygodnee-dostupa-po-indeksu":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":17,"progress":18,"seo":19},1141,"kogda-polnoe-skanirovanie-nabora-dannykh-vygodnee-dostupa-po-indeksu",35,"bazy-dannykh","Базы данных","🗄️","Когда полное сканирование набора данных выгоднее доступа по индексу?","Полное сканирование (Sequential Scan) выгоднее доступа по индексу (Index Scan), когда суммарная стоимость одноблочных чтений через индекс превышает стоимость многоблочного последовательного чтения всей таблицы.\n\n### Механика сравнения\n\n| Характеристика | Полное сканирование | Доступ по индексу |\n|---------------|--------------------|--------------------|\n| Тип чтения | Многоблочное (sequential I\u002FO) | Одноблочное (random I\u002FO) |\n| Скорость одного чтения | Высокая (последовательно) | Низкая (случайные позиции) |\n| Количество чтений | Все блоки таблицы | Блоки индекса + блоки данных |\n| Эффективность | Постоянная | Зависит от селективности и кластеризации |\n\n### Когда полное сканирование выгоднее\n\n- Низкая селективность предиката — запрос возвращает значительную долю таблицы (ориентир: более 5-15% строк, зависит от СУБД)\n- Слабая кластеризация данных — строки, отобранные индексом, разбросаны по разным страницам диска\n- Маленькая таблица — целиком помещается в несколько блоков\n- Нет подходящего индекса — запрос по неиндексированному столбцу\n- Покрывающий индекс недоступен — после Index Scan нужен дополнительный переход к таблице (Heap Fetch)\n\n### Как оптимизатор принимает решение\n\nОптимизатор СУБД оценивает стоимость каждого плана на основе:\n- Статистики таблиц (количество строк, распределение значений)\n- Фактора кластеризации (correlation в PostgreSQL)\n- Стоимости sequential I\u002FO vs random I\u002FO\n- Размера буферного пула (shared_buffers)\n\n```sql\n-- PostgreSQL: посмотреть план запроса\nEXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'active';\n\n-- Если оптимизатор выбирает Seq Scan, значит он считает его дешевле\n```\n\n### Практический пример\n\nТаблица `orders`: 1 000 000 строк, 90% имеют `status = 'completed'`.\n\n```sql\n-- Индекс НЕ используется (90% строк — полное сканирование дешевле)\nSELECT * FROM orders WHERE status = 'completed';\n\n-- Индекс используется (2% строк — высокая селективность)\nSELECT * FROM orders WHERE status = 'refunded';\n```\n\n> **На собеседовании:** интервьюер проверяет понимание работы оптимизатора. Ключевая мысль: random I\u002FO дороже sequential I\u002FO, и при большой доле возвращаемых строк накопленная стоимость одноблочных чтений превышает стоимость одного последовательного прохода. Частая ошибка — не упомянуть фактор кластеризации.","","senior",[15,16],"databases","performance",[],null,{"title":20,"description":21,"ogTitle":22,"ogDescription":23,"keywords":24,"schemaAnswer":34,"featuredSnippetReady":35},"Когда полное сканирование таблицы выгоднее индекса — Gymterview","Sequential Scan vs Index Scan: когда полное сканирование быстрее. Механика random I\u002FO vs sequential I\u002FO, селективность, фактор кластеризации, EXPLAIN ANALYZE.","Sequential Scan vs Index Scan: когда полное сканирование выгоднее — Gymterview","Когда полное сканирование таблицы быстрее индекса: низкая селективность, слабая кластеризация, маленькие таблицы.",[25,26,27,28,29,30,31,32,33],"Sequential Scan","Index Scan","full table scan","random I\u002FO","sequential I\u002FO","оптимизатор","EXPLAIN ANALYZE","PostgreSQL","селективность","Полное сканирование выгоднее, когда стоимость одноблочных random I\u002FO через индекс превышает стоимость многоблочного sequential I\u002FO всей таблицы. Это происходит при: низкой селективности (более 5-15% строк), слабой кластеризации данных, маленьких таблицах, отсутствии покрывающего индекса. Оптимизатор СУБД принимает решение на основе статистики и фактора кластеризации.",true]