Для запросов, включающих небольшие части строк таблицы, индексы всегда полезны, будь то 100
строк или 1,000,000
.
См. Эту запись в моем блоге для примеров с планами и подробностями работы:
Такие запросы:
SELECT *
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
наиболее вероятно будет использовать HASH JOIN
. Будет создана хеш-таблица для таблицы меньшего размера, а строки из более крупной таблицы будут использованы для проверки хеш-таблицы.
Для этого индекс не нужен.
Однако этот запрос:
SELECT *
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
WHERE t1.othercol = @value
будет использовать NESTED LOOPS
: строки из внешней таблицы (table1
) будут искать с помощью индекса на table1.othercol
, а строки из внутренней таблицы (table2
) будут искать с помощью индекса на table2.col
.
Если у вас нет индекса для col1
, будет использоваться HASH JOIN
, который требует сканирования всех строк из обеих таблиц и дополнительных ресурсов для создания хэш-таблицы.
Индексы также полезны для таких запросов:
SELECT t2.col
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
, в этом случае движку вообще не нужно читать table2
: все, что вам нужно для этого запроса, можно найти в индексе, который может быть намного меньше самой таблицы и более эффективным для чтения.
И, конечно, если вам нужно отсортировать данные и иметь индексы как table1.col
, так и table2.col
, тогда выполните следующий запрос:
SELECT *
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
ORDER BY
t2.col
, вероятно, будет использовать метод MERGE JOIN
, который будет очень быстрым, если оба входных набора строк отсортированы, а его вывод также отсортирован, что означает, что ORDER BY
выйдет свободно.
Обратите внимание, что даже если у вас нет индекса, оптимизатор может выбрать Eager Spool
вашу маленькую таблицу, что означает создание временного индекса на время запроса, и отбросить индекс после его завершения.
Если запрос небольшой, он будет очень быстрым, но, опять же, индекс не повредит (я имею в виду SELECT
запросов). Если оптимизатору это не понадобится, он просто не будет использоваться.
Обратите внимание, что создание индекса может повлиять на производительность DML
, но это другая история.