Necessidade de índices em chaves estrangeiras

30

Estou lutando com índices, chaves primárias e chaves estrangeiras ... E a necessidade de tê-los todos.

Se eu tiver duas tabelas, ambas terão um número inteiro como chave primária.
A primeira tabela faz referência através de um FK à chave primária da segunda tabela.

  • Nas duas tabelas, tenho um índice de chave primária na coluna ID
  • Eu criei uma restrição FK na table1.ref_fieldreferência ao PK da segunda tabela ( table2.id)
  • e eu adicionei um índice em table1.ref_field

Essa é a melhor maneira de organizar esses índices, chaves primárias e estrangeiras?

stUrb
fonte

Respostas:

30

Seu design é bom. Se você estiver tendo um problema de desempenho (que não pode saber em tempo de design), crie um índice na coluna table1.ref_field, na mesma ordem (ASC) da coluna table2.id. Isso melhorará o desempenho das junções entre as tabelas / colunas. Há uma sobrecarga na manutenção de qualquer índice, portanto, você deseja pesar esse custo em relação ao benefício de um desempenho aprimorado.

O PostgreSQL não cria automaticamente esses índices em colunas de chave estrangeira que fazem referência a outras colunas, infelizmente, então você deve fazer isso sozinho.

Aqui está uma pergunta StackOverflow sobre o mesmo tópico:

Postgres e índices em chaves estrangeiras e chaves primárias

Aqui está uma consulta para ajudar a determinar onde você pode se beneficiar com a adição de um índice:

Postgresql: índices em chaves estrangeiras

peterk411
fonte
Nem sempre é lamentável - se você não fizer isso DELETEda tabela referenciada, poderá economizar muita E / S e CPU, evitando manter um índice não utilizado. Eu acho que deve ser criado por padrão, apenas tem uma opção para suprimir sua criação.
Craig Ringer
Craig Ringer Não apenas DELETE pode ter impacto nisso, se você selecionar da tabela de partentes para as filho, também terá problemas de desempenho. Esta documentação da Oracle explica mais: asktom.oracle.com/pls/asktom/…
777Anon