ordem das colunas do índice multicolunas
-
27-09-2019 - |
Pergunta
Disseram-me e li em todos os lugares (mas ninguém se atreveu a explicar o porquê) que ao compor um índice em múltiplas colunas eu deveria colocar a coluna mais seletiva primeiro, por razões de desempenho.Por que é que?É um mito?
Solução
Eu deveria colocar a coluna mais seletiva primeiro
De acordo com Tom, a seletividade de coluna não tem impacto no desempenho para consultas que usam todas as colunas do índice (ela afeta a capacidade do Oracle de compactar o índice).
não é a primeira coisa, não é a coisa mais importante.claro, é algo a considerar, mas está relativamente longe no grande esquema das coisas.
Em certos casos estranhos, muito peculiares e anormais (como o acima, com dados totalmente distorcidos), a seletividade pode facilmente importar. NO ENTANTO, eles são
a) bastante raro b) realmente dependente dos valores usados em tempo de execução, como todas as consultas distorcidas são
então, em geral, olhe as dúvidas que você tem, tente minimizar os índices que você precisa com base nisso.
O número de valores distintos em uma coluna em um índice concatenado não é relevante ao considerar a posição no índice.
No entanto, essas considerações devem vir em segundo lugar ao decidir sobre a ordem das colunas do índice.O mais importante é garantir que o índice possa ser útil para muitas consultas, de modo que a ordem das colunas reflita o uso dessas colunas (ou a falta delas) nas cláusulas where de suas consultas (pelo motivo ilustrado por AndreKR).
COMO VOCÊ USA o índice - isso é o que é relevante na hora de decidir.
Todas as outras coisas sendo iguais, eu ainda colocaria a coluna mais seletiva em primeiro lugar.Parece certo...
Atualizar: Outra citação de Tom (obrigado a Milão por encontrá-lo).
No Oracle 5 (sim, versão 5!), Houve um argumento para colocar as colunas mais seletivas em primeiro lugar em um índice.
Desde então, não é verdade que colocar as entradas mais discriminador em primeiro lugar no índice tornará o índice menor ou mais eficiente.Parece que vai, mas não vai.
Com a compactação da chave do índice, há um argumento convincente a seguir para o outro lado, pois pode diminuir o índice.No entanto, isso deve ser determinado pela forma como você usa o índice, conforme declarado anteriormente.
Outras dicas
Você pode omitir colunas da direita para a esquerda ao usar um índice, ou seja, quando você tiver um índice em col_a, col_b
você pode usá -lo em WHERE col_a = x
Mas você não pode usá -lo em WHERE col_b = x
.
Imagine ter uma lista telefônica que seja classificada pelos primeiros nomes e depois pelos sobrenomes.
Pelo menos na Europa e nos primeiros nomes dos EUA, têm uma seletividade muito menor do que os sobrenomes, portanto, procurar o primeiro nome não restringiria muito o conjunto de resultados; portanto, ainda haveria muitas páginas para verificar o sobrenome correto.
A ordem das colunas no índice deve ser determinada por suas consultas e não ser nenhuma consideração de seletividade. Se você tiver um índice em (a, b, c), e a maioria das suas consultas de coluna única é contra a coluna C, seguida por A, depois as coloque na ordem de C, A, B na definição de índice para a melhor eficiência . O Oracle prefere usar a borda principal do índice para a consulta, mas pode usar outras colunas no índice em um caminho de acesso menos eficiente conhecido como Skip-Scan.
O mais seletivo é o seu índice, o mais rápido é a pesquisa.
Simplesmente imagine uma agenda telefônica: você pode encontrar alguém principalmente rápido pelo último nome. Mas se você tiver muitas pessoas com o mesmo nome mais longo, durará mais tempo em procurar a pessoa, olhando para o primeiro nome.
Portanto, você deve fornecer as colunas mais seletivas primeiro para evitar o máximo possível esse problema.
Além disso, você deve garantir que suas consultas estejam usando corretamente esses "critérios de seletividade".