Eficiência de chave primária composta como chave estrangeira

12

Eu tenho uma tabela com uma chave primária composta (composta por 4 colunas) que é usada para garantir que nenhuma duplicata seja inserida na tabela. Agora estou precisando de uma nova tabela que precisará referenciar as chaves nesta tabela como chaves estrangeiras.

Minha pergunta é qual abordagem é mais eficiente para velocidades de pesquisa:

1) Crio a nova tabela, incluindo todas as 4 colunas, e as refiro todas em uma chave estrangeira.

ou

2) Crie uma nova coluna de identidade na tabela Chave Primária e use-a como uma chave estrangeira na nova tabela.

Espera-se que esse banco de dados retenha uma quantidade muito grande de dados, então eu o criei até agora com o objetivo de minimizar a quantidade de dados mantidos em cada tabela. Com isso em mente, a opção 2 seria a melhor abordagem, pois salvarei 2 colunas int e uma coluna datetime para cada linha, mas quero evitar aumentar o tempo de pesquisa, se desnecessário.

aaroncatlin
fonte
1
Pessoalmente, quase sempre usava uma chave substituta (por exemplo, uma INT IDENTITY) nesse caso - torna a referência e a junção dessa tabela muito mais fácil. Para evitar duplicatas, coloque uma restrição UNIQUE nessas quatro colunas. Também: chaves primárias estreitas são muito melhor por razões de desempenho (se eles são usados como chave de cluster)
marc_s

Respostas:

11

O custo do uso de um PK inteiro sintético simples é pequeno e o benefício no seu caso provavelmente seria bastante considerável.

  • Como você aponta, você terá um relacionamento FK muito mais simples.
  • Uma PK pequena cria índices pequenos (e rápidos). Seu espaço total de tabela provavelmente será reduzido com a adição dessa coluna.
  • Se as regras de negócios mudarem, você não precisará reordenar a tabela.

A única desvantagem material que vem à mente é que você pode perder o desempenho em consultas que se beneficiaram do armazenamento em cluster no PK composto. Se você acha que isso é significativo, continue o agrupamento na chave candidata composta, mas coloque a PK na chave sintética.

Jon de todos os comércios
fonte
5

Como tantas vezes no mundo SQL, a resposta é: "Depende".

Dê uma olhada nesta pergunta para alguns indicadores: chaves naturais fornecem desempenho mais alto ou mais baixo no SQL Server que as chaves inteiras substitutas?

Há casos em que há uma melhora no desempenho ao usar chaves naturais como chaves estrangeiras. No entanto, na maioria dos casos, você será melhor com chaves menores (leia-se: chaves substitutas).

Se você introduzir essa coluna IDENTITY, eu a tornaria a Chave Primária e alteraria as colunas "naturais" para uma Restrição Única.

Sebastian Meine
fonte