Разница между двумя индексами со столбцами, заданными в обратном порядке
Есть ли различия между следующими двумя индексами?
- IDX_IndexTables_1
- IDX_IndexTables_2
Если таковые имеются, каковы различия?
create table IndexTables (
id int identity(1, 1) primary key,
val1 nvarchar(100),
val2 nvarchar(100),
)
create index IDX_IndexTables_1 on IndexTables (val1, val2)
GO
create index IDX_IndexTables_2 on IndexTables (val2, val1)
GO
5 ответов
Да. Есть разница.
Сводный указатель IDX_IndexTables_1
может быть использован для любого запроса, где val1
столбец используется в предложении where.
Сводный указатель IDX_IndexTables_2
может быть использован для любого запроса, где val2
столбец используется в предложении where.
Так, например IDX_IndexTables_2
нельзя использовать для этого запроса (но можно использовать IDX_IndexTables_1):
SELECT val1, val2 FROM IndexTables
WHERE val1 = some_value
но может быть использован для этого запроса:
SELECT val1, val2 FROM IndexTables
WHERE val2 = some_value AND val1 = some_other-value
Способ думать о составном индексе - думать о бумажном телефонном справочнике; Он индексируется по столбцу фамилии, а затем по столбцу имени: вы можете искать по фамилии, но не по имени.
Индекс, состоящий из нескольких столбцов, концептуально не отличается от того, как брать все поля столбцов и объединять их вместе - индексировать результат как одно поле.
Поскольку индексы являются b-деревьями, они всегда ищутся слева направо. Вы должны начать свой поиск слева, чтобы объединить в пару результаты по мере перемещения вправо, чтобы индекс выполнял свою работу и предоставлял полезные результаты.
Только с одним индексированным полем:
WHERE val1 LIKE 'myvalue%' (uses index)
WHERE val1 LIKE '%myvalue' (cannot use index)
Та же концепция применяется для многостолбцовых индексов:
Когда порядок равен val1,val2
WHERE val1='value1' (uses index)
WHERE val2='value2' (cannot use index)
Когда порядок равен val2,val1
WHERE val1='value1' (cannot use index)
WHERE val2='value2' (uses index)
Если оба поля совпадают, порядок индексов в этом случае не имеет значения.
WHERE val1='value1' AND val2='value2' (uses index in any order)
У вас есть составной индекс. Порядок важен, когда ваше предложение WHERE не использует все столбцы в составном индексе.
Рассмотрим этот запрос:
SELECT val1
FROM IndexTables
WHERE val1 = 'MyValue'
Чтобы узнать, какой индекс можно считать прочитанным слева направо, столбцы в ваших составных индексах. Если столбец не существует в вашем запросе до того, как вы прочитаете все столбцы в вашем запросе, индекс не будет использоваться.
IDX_IndexTables_1
(val1, val2): чтение слева направо val1 существует, и это наш единственный столбец, поэтому этот индекс будет рассматриваться
IDX_IndexTables_2
(val2, val1): Чтение слева направо val2 не существует в этом запросе, поэтому он не будет использоваться.
Предыдущие ответы описывают, как использовать первый столбец каждого индекса. (в предложении where).
Я думаю, что также важно указать, что второй столбец полезен, потому что он потенциально увеличивает производительность запросов, которые включают второй столбец.
Следующий запрос будет выполнен с JUST поиском индекса по IDX_1, сохраняя ценные поиски в базовой таблице (поскольку val2 уже является частью индекса).
SELECT val2 from IndexTables where val1 = @someVal1
Аналогично, обратный индекс оптимизирует этот запрос:
SELECT val1 from IndexTables where val2 = @someVal2
Однако только один (неважно, какой) из двух индексов необходим для оптимизации следующего запроса:
SELECT val1, val2 from IndexTables where val1 = @someVal1 and val2 = @someVal2
Это показывает, что в зависимости от запросов, которые получает ваша таблица, может существовать законная причина иметь оба индекса.
Другие люди ответили, что они разные, и я согласен.
Я добавлю некоторые другие мысли, хотя...
- индекс (col1, col2) означает, что вам не нужен индекс только для col1
- индекс (col2, col1) означает, что вам не нужен индекс только для col2
- порядок имеет значение, если это распространяется (например, ГДЕ на col1, SELECT col2)
- Направление (ASC/DESC) также имеет значение ( Другой вопрос 1, Другой вопрос 2)