Назад к вопросам
Middle+
70
questionbank
Когда полное сканирование набора данных бывает более эффективным, чем доступ по индексу?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Когда процент записей, которые необходимо обработать, достаточно высокий (например, более 10-20%), чтобы издержки на поиск по индексу и чтение отдельных блоков данных превзошли преимущества.
Другие случаи:
- Отсутствие подходящего индекса: Если для запроса нет индекса, покрывающего фильтрующие поля или предоставляющего доступ к данным быстрее, чем полное сканирование.
- Неравномерное распределение данных (skew): Если индексированное поле имеет низкую кардинальность и большая часть данных сосредоточена на небольшом количестве значений, сканирование может быть быстрее, чем обход большого количества листьев индекса с одинаковыми значениями.
- Маленький набор данных: Для небольших таблиц издержки на поддержание и использование индекса могут быть выше, чем выгода от его использования.
- Последовательное чтение: Полное сканирование обычно предполагает последовательное чтение с диска, что может быть быстрее, чем случайное чтение при доступе по индексу, особенно на HDD.
- Большой объем данных в строке: Если каждая строка содержит большой объем данных, чтение полного набора данных за раз может быть эффективнее, чем многократный доступ к диску для получения отдельных строк по индексу.
Пример, когда полное сканирование может быть эффективнее:
// Простой SELECT * на таблице с небольшим количеством строк.
SELECT *
FROM small_table;
// Запрос с фильтром, который затрагивает большинство строк
SELECT *
FROM large_table
WHERE status = 'processed'; // Если большинство строк имеет статус 'processed'