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
Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top