Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:a ordem das colunas importa em um índice?

  1. Se a e b ambos têm 1000 valores distintos e são sempre consultados juntos, então a ordem das colunas no índice realmente não importa. Mas se a tem apenas 10 valores distintos ou você tem consultas que usam apenas uma das colunas, então isso importa; nesses cenários, o índice não pode ser usado se a ordenação das colunas não corresponder à consulta.
  2. A coluna com os valores menos distintos deve ser a primeira e a coluna com os valores mais distintos por último. Isso não apenas maximiza a utilidade do índice, mas também aumenta os ganhos potenciais da compactação do índice.
  3. O tipo de dados e o comprimento da coluna têm impacto no retorno que podemos obter da compactação de índice, mas não na melhor ordem das colunas em um índice.
  4. Organize as colunas com a coluna menos seletiva primeiro e a coluna mais seletiva por último. No caso de empate leve com a coluna que é mais provável de ser usada sozinha.

A única exceção potencial para 2. e 3. é com colunas DATE. Como as colunas Oracle DATE incluem um elemento de tempo, elas podem ter 86.400 valores distintos por dia . No entanto, a maioria das consultas em uma coluna de dados geralmente está interessada apenas no elemento dia, portanto, convém considerar apenas o número de dias distintos em seus cálculos. Embora eu suspeite que isso não afetará a seletividade relativa em apenas um punhado de casos.

editar (em resposta ao comentário de Nick Pierpoint)

As duas principais razões para liderar com a coluna menos seletiva são
  1. Compressão de índice
  2. Pular leituras de índice

Ambos trabalham sua mágica sabendo que o valor no slot atual é o mesmo que o valor no slot anterior. Consequentemente, podemos maximizar o retorno dessas técnicas minimizando o número de vezes que o valor muda. No exemplo a seguir, A tem quatro valores distintos e B tem seis. Os idem representam um valor compressível ou um bloco de índice ignorável.
Least selective column leads ...

A          B
---------  -
AARDVARK   1
"          2
"          3
"          4
"          5
"          6
DIFFVAL    1
"          2
"          3
"          4
"          5
"          6
OTHERVAL   1
"          2
"          3
"          4
"          5
"          6
WHATEVER   1
"          2
"          3
"          4
"          5
"          6

Os cabos de coluna mais seletivos ...
B  A
-  --------
1  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
2  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
3  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
4  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
5  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
6  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER

Mesmo neste exemplo trivial, (A, B) tem 20 slots ignoráveis ​​em comparação com os 18 de (B, A) . Uma disparidade mais ampla geraria maior ROI na compactação de índice ou melhor utilidade das leituras de salto de índice.

Como é o caso da maioria das heurísticas de ajuste, precisamos fazer benchmark usando valores reais e volumes realistas. Este é definitivamente um cenário em que a distorção de dados pode ter um impacto dramático na eficácia de diferentes abordagens.

"Eu acho que se você tem um primeiro índice altamente seletivo, então - de uma perspectiva de desempenho - você fará bem em colocá-lo em primeiro lugar."

Se tivermos uma coluna altamente seletiva, devemos construir um índice próprio. Os benefícios adicionais de evitar uma operação FILTER em um punhado de linhas provavelmente não serão superados pela sobrecarga de manter um índice composto.

Índices de várias colunas são mais úteis quando temos:
  • duas ou mais colunas de seletividade média,
  • que são usados ​​com frequência na mesma consulta.