Existe algum benefício em certa ordem de colunas ao definir índices

13

Por exemplo, se eu tiver dois índices:

CREATE INDEX IDX_1 ON MY_TABLE_1
 (ITEM, DATE, LOCATION)
 COMPUTE STATISTICS;

CREATE INDEX IDX_2 ON MY_TABLE_1
 (DATE, LOCATION, ITEM)
 COMPUTE STATISTICS;

Isso tornaria IDX_2redundante? Caso contrário, como determino a ordem de declaração das colunas?

Devo adaptar índices para consultas regulares?

Lewis Norton
fonte

Respostas:

12

Sim, o benefício surge quando você deseja consultar uma parte do índice. Se você colocar os predicados usados ​​parcialmente, o índice poderá ser usado para consultas que envolvam esses predicados, mas não todas as colunas no índice.

Além disso, a menos que você tenha outros requisitos, pode ajudar a colocar os predicados mais seletivos em primeiro lugar, pois isso pode reduzir as operações de busca por índice mais rapidamente.

No seu caso, IDX_2não é necessariamente redundante, dependendo da natureza das consultas na tabela. No entanto, pode não ser necessário incluir todas as colunas. Se, por exemplo, você fizer muitas consultas locatione, em dateseguida, IDX_2for útil para ajudar a resolvê-las, IDX_1não está na ordem correta para ser útil para isso. Você pode, no entanto, achar que isso itemé redundante IDX_2.

A partir do 9i, a Oracle introduziu um operador 'skip scan' , no qual colunas de índice à direita podem ser consultadas com mais eficiência, o que pode reduzir a necessidade de índices adicionais desse tipo.

Em um caso mais específico, se você estiver consultando itempor locatione datee não precisa de qualquer outra coluna, em seguida, a consulta poderia ser completamente resolvidos embora o índice sem ter que ler qualquer coisa, desde a mesa. Você também pode criar índices de cobertura que tenham colunas não indexadas anexadas. Se todas as colunas necessárias puderem ser resolvidas a partir do índice de cobertura, a consulta não precisará tocar na tabela principal.

Finalmente, em resposta à sua última pergunta: se você possui um conjunto de consultas usadas regularmente, que estão consumindo muitos recursos e podem ser ajustadas usando um índice, certamente vale a pena considerar. No entanto, a manutenção de índices vem com uma sobrecarga nas inserções, portanto, você precisará trocar o desempenho da consulta pela sobrecarga que os índices colocam nas operações de inserção ou atualização.

ConcernedOfTunbridgeWells
fonte
3
@ConcernedOfTunbridgeWells: Uma abordagem alternativa é usar a compactação de chave de índice e ter as colunas menos seletivas (menos valores distintos) à frente. Isso ajuda a gerar um índice menor, enquanto ainda permite que as skip-scans funcionem bem.
Adam Musch
2

Outra coisa a considerar são as colunas com muitos valores nulos.

Se essas colunas tiverem alguma coluna especificada após elas no índice, os valores nulos deverão ser indexados. Caso contrário, como de costume, os valores nulos não serão indexados (é claro, isso pressupõe que você esteja usando um índice de árvore b).

Portanto, se você tiver colunas com um grande número de valores nulos, colocá-los no final do índice poderá economizar uma quantidade significativa de espaço em disco.

Michal Tenenberg
fonte