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

Boa prática para usar índices reversos em chaves substitutas? (Oráculo)


Em geral, se você não estiver usando RAC, não haverá motivo para usar um índice de chave reversa.

Do ponto de vista do desempenho, é muito melhor ter um ou dois blocos quentes em qualquer momento que estejam sujeitos a inserções porque isso garante essencialmente que os blocos quentes estarão no cache de buffer e no INSERT não terá que incorrer no custo de ler o bloco do disco. Se você tiver inserções entrando em blocos aleatórios em um índice, há uma probabilidade muito maior de que o bloco desejado tenha ficado fora do cache e incorra no custo de uma E/S física.

O custo de manter um índice equilibrado é mínimo, mas mesmo isso favorece um índice padrão. Se você tiver uma chave primária gerada por sequência com um índice normal, a Oracle fará um Divisão de bloco 90/10 no bloco mais à direita quando esse bloco estiver cheio. Por outro lado, se você tiver um índice de chave reversa, a Oracle precisará fazer Divisões de bloco 50/50 sempre que um determinado bloco é preenchido. Uma divisão de bloco 50/50 copia metade dos dados do bloco antigo para o novo bloco, uma divisão de bloco 90/10 copia apenas o valor de dados mais à direita para o novo bloco. A divisão de blocos de 90/10, portanto, é muito mais barata do que uma divisão de blocos de 50/50 e você precisaria fazer aproximadamente o mesmo número de divisões de blocos, independentemente do tipo de índice escolhido. Portanto, o custo de manter um índice regular é menor que o custo de manter um índice de chave reversa, mesmo ignorando o efeito do cache.

A razão pela qual você consideraria usar um índice de chave reversa seria que você está usando RAC e deseja evitar o custo de ter muitos nós RAC lutando pelo mesmo bloco ativo. Se você precisar enviar constantemente o bloco quente de um nó para outro para fazer a próxima inserção, pode valer a pena usar um índice de chave reversa para reduzir essa contenção. Se você licenciou a opção de particionamento, seria melhor ainda usar um índice particionado por hash (isso pode ser feito independentemente de as tabelas serem particionadas ou não). Se você não licenciou a opção de particionamento, um índice de chave reversa pode ser bom o suficiente para resolver a contenção no bloco ativo para não exigir que você licencie o particionamento.