Não há nada errado com o GUID como chaves e clusters em um sistema OLTP (a menos que você tenha MUITOS índices na tabela que sofrem com o tamanho aumentado do cluster). Por uma questão de fato, eles são muito mais escaláveis do que as colunas IDENTITY.
Existe uma crença generalizada de que o GUID é um grande problema no SQL Server - em grande parte, isso é simplesmente errado. Por uma questão de fato, o GUID pode ser significativamente mais escalável em caixas com mais de 8 núcleos:
Sinto muito, mas seus desenvolvedores estão certos. Preocupe-se com outras coisas antes de se preocupar com o GUID.
Ah, e finalmente: por que você deseja um índice de cluster em primeiro lugar? Se sua preocupação for um sistema OLTP com muitos índices pequenos, é provável que você esteja melhor com uma pilha.
Vamos agora considerar o que a fragmentação (que o GUID apresentará) faz em suas leituras. Existem três grandes problemas com a fragmentação:
- Página divide o E / S do disco de custo
- As páginas meio cheias não são tão eficientes quanto a memória
- Faz com que as páginas sejam armazenadas fora de ordem, o que torna a E / S sequencial menos provável
Como sua preocupação na pergunta é sobre escalabilidade, que podemos definir como "A adição de mais hardware faz o sistema acelerar mais", esse é o menor dos seus problemas. Para abordar cada um por sua vez
Anúncio 1) Se você deseja dimensionar, pode comprar E / S. Mesmo um SSD barato de Samsung / Intel de 512 GB (a alguns USD / GB) oferece mais de 100 mil IOPS. Você não consumirá isso tão cedo em um sistema de 2 soquetes. E se você se deparar com isso, compre mais um e estará pronto
Anúncio 2) Se você fizer exclusões na sua tabela, você terá meia página inteira de qualquer maneira. E mesmo se não o fizer, a memória é barata e para todos, exceto os maiores sistemas OLTP - os dados quentes devem caber ali. A busca de empacotar mais dados em páginas é subotimizadora quando você procura escala.
Anúncio 3) Uma tabela criada a partir de dados freqüentemente fragmentados e altamente fragmentados faz E / S aleatória exatamente na mesma velocidade que uma tabela preenchida sequencialmente
Com relação à associação, existem dois tipos principais de associação que você provavelmente verá em uma carga de trabalho OLTP, como: Hash e loop. Vamos analisar cada um por vez:
Junção de hash: uma junção de hash pressupõe que a tabela pequena seja varrida e a maior seja normalmente procurada. É provável que tabelas pequenas estejam na memória; portanto, a E / S não é sua preocupação aqui. Já mencionamos o fato de que as buscas têm o mesmo custo em um índice fragmentado que em um índice não fragmentado
Junção de loop: a tabela externa será procurada. Mesmo custo
Você também pode ter várias verificações incorretas de tabela - mas o GUID novamente não é sua preocupação, é a indexação adequada.
Agora, você pode ter algumas verificações de intervalo legítimas em andamento (especialmente ao ingressar em chaves estrangeiras) e, nesse caso, os dados fragmentados são menos "compactados" quando comparados aos dados não fragmentados. Mas vamos considerar o que as junções que você provavelmente verá nos dados 3NF bem indexados são:
Uma junção de uma tabela que possui uma referência de chave estrangeira à chave primária da tabela que faz referência
O contrário
Anúncio 1) Nesse caso, você está buscando uma única busca na chave primária - unindo n a 1. Fragmentação ou não, mesmo custo (uma busca)
Anúncio 2) Nesse caso, você está ingressando na mesma chave, mas pode recuperar mais de uma linha (busca por intervalo). A junção neste caso é de 1 a n. No entanto, na tabela estrangeira que você procura, você está procurando a chave SAME, que tem a mesma probabilidade de estar na mesma página em um índice fragmentado que em um índice não fragmentado.
Considere essas chaves estrangeiras por um momento. Mesmo se você tivesse sequenciado "perfeitamente" nossas chaves primárias - qualquer coisa que aponte para essa chave ainda será não sequencial.
Obviamente, você pode estar rodando em uma máquina virtual em alguma SAN em algum banco com baixo custo e alto processo. Então, todo esse conselho será perdido. Mas se esse é o seu mundo, a escalabilidade provavelmente não é o que você está procurando - você está procurando desempenho e alta velocidade / custo - que são coisas diferentes.