A diferença entre os 2 índices com colunas definidas na ordem inversa
-
20-09-2019 - |
Pergunta
Existem diferenças entre dois seguintes índices?
- IDX_IndexTables_1
- IDX_IndexTables_2
Se existem, quais são as diferenças?
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
Solução
Sim. Há uma diferença.
O índice composto IDX_IndexTables_1
pode ser usado para qualquer consulta onde val1
A coluna é usada na cláusula onde.
O índice composto IDX_IndexTables_2
pode ser usado para qualquer consulta onde val2
A coluna é usada na cláusula onde.
Então, por exemplo IDX_IndexTables_2
não pode ser usado para esta consulta (mas idx_indextables_1 pode ser usado):
SELECT val1, val2 FROM IndexTables
WHERE val1 = some_value
mas pode ser usado para esta consulta:
SELECT val1, val2 FROM IndexTables
WHERE val2 = some_value AND val1 = some_other-value
A maneira de pensar em um índice composto é pensar em uma diretoria telefônica em papel; É indexado pela coluna de sobrenome e, em seguida, pela coluna FirstName: você pode procurar por sobrenome, mas não por primeiro nome por conta própria.
Outras dicas
Um multi-índice de coluna é conceitualmente diferente do que tomar todas as colunas campos e concatinating-las-a indexação do resultado como um único campo.
Pois os índices são árvores b são sempre procurei esquerda para a direita.Você tem que começar sua busca a partir da esquerda para emparelhar os resultados como você se move para a direita para o índice de fazer o seu trabalho e fornecer resultados úteis.
Com apenas um único campo é indexado:
WHERE val1 LIKE 'myvalue%' (uses index)
WHERE val1 LIKE '%myvalue' (cannot use index)
O mesmo conceito é aplicado para multi-índices de coluna:
Quando a ordem é val1,val2
WHERE val1='value1' (uses index)
WHERE val2='value2' (cannot use index)
Quando a ordem é val2,val1
WHERE val1='value1' (cannot use index)
WHERE val2='value2' (uses index)
Se ambos os campos são comparados exatamente, a fim de índices não importa nesse caso.
WHERE val1='value1' AND val2='value2' (uses index in any order)
O que você tem é um índice composto. O pedido é importante quando você não está usando todas as colunas no índice composto.
Considere esta consulta:
SELECT val1
FROM IndexTables
WHERE val1 = 'MyValue'
Para saber qual índice pode ser considerado lido da esquerda para a direita, as colunas em seus índices compostos. Se a coluna não existir em sua consulta antes de ler todas as colunas da sua consulta, o índice não será usado.
IDX_IndexTables_1
(Val1, Val2): Reading da esquerda para a direita Val1 existe e é a nossa única coluna para que esse índice seja considerado
IDX_IndexTables_2
(Val2, Val1): A leitura da esquerda para a direita Val2 não existe nesta consulta, para que não seja usada.
As respostas anteriores descrevem como usar a primeira coluna de cada índice. (na cláusula onde).
Eu acho que também é importante ressaltar que a segunda coluna é útil porque aumenta potencialmente o desempenho das consultas que envolvem a segunda coluna.
A consulta a seguir será concluída com apenas uma busca de índice no IDX_1, salvando pesquisas valiosas na tabela base (já que o VAL2 já faz parte do índice).
SELECT val2 from IndexTables where val1 = @someVal1
Da mesma forma, o índice invertido otimizará esta consulta:
SELECT val1 from IndexTables where val2 = @someVal2
No entanto, apenas um (não importa qual) dos dois índices é necessário otimizar a seguinte consulta:
SELECT val1, val2 from IndexTables where val1 = @someVal1 and val2 = @someVal2
Isso mostra que, dependendo das consultas que sua tabela recebe, pode haver um motivo legítimo para ter os dois índices.
Outras pessoas responderam que são diferentes, e eu concordo.
Vou adicionar outros pensamentos ...
- O índice (col1, col2) significa que você não precisa de um índice apenas no Col1
- O índice (col2, col1) significa que você não precisa de um índice apenas no Col2
- O pedido é importante se isso estiver cobrindo (por exemplo, onde no Col1, selecione col2)
- A direção (ASC/DEC) também importa (Outra pergunta 1, Outra pergunta 2)