Sempre gosto mais do que é novo e vem para somar. A alguns anos, sempre quando me deparava com modelagem de bancos dava preferência a tipos de dados uniqueidentifier. É uma preferência pessoal, porém, ajuda quando temos que lidar com INSERTS de aplicações offline.
Mas em uma conversa com o Rafael, um amigo de trabalho, começamos a discutir sobre o desempenho e performance se comparado a uma chave primária do tipo int. Com certeza vai ter problema de escabilidade. Comparar uma a performance de indexação de um campo de 4 bytes com um binário de 16 bytes é covardia.
Mas desde a versao 7 do SQL Server, a Microsoft criou uma solução para isso. Antes, os campos uniqueidentifier você atribuia um valor com alguma função System.Guid.NewGuid() ou mesmo interna do SQL Server, NEWID(). Mas isso gera queda de performance e problemas de escabilidade. O banco vai fragmentar. Olha algumas GUID criadas com o .NET Framework.
- {4558B194-FA8B-435f-9FDF-363EF258447F}
- {0C93A685-0F67-4e04-A8BA-AB04B460320E}
- {669D610F-ECED-4fea-8F88-18B63551A9D0}
- {66EB380A-CD70-4ede-AF99-5B18927524ED}
Indexar uma tabela carregada com chaves primárias nesse formato traria dor de cabeça.
Agora, veja algumas GUID criadas com a função interna NEWSEQUENTIALID() do SQL Server 7.
- B3BFC6B1-05A2-11D6-9FBA-00C04FF317DF
- B3BFC6B2-05A2-11D6-9FBA-00C04FF317DF
- B3BFC6B3-05A2-11D6-9FBA-00C04FF317DF
- B3BFC6B4-05A2-11D6-9FBA-00C04FF317DF
- B3BFC6B5-05A2-11D6-9FBA-00C04FF317DF
Dá pra perceber que apenas o oitavo byte é mudado, o restante é constante, isso que ajuda a indexação. No SQL Server 2000 apenas o 13º byte é constate. Olha agora algumas GUID geradas no meu SQL Server 2005 Express.
- 6dca3a74-097c-dd11-8241-0019d1a5065d
- 6eca3a74-097c-dd11-8241-0019d1a5065d
- 351ccf7a-097c-dd11-8241-0019d1a5065d
- 54703d8b-097c-dd11-8241-0019d1a5065d
- 55703d8b-097c-dd11-8241-0019d1a5065d
A sequência é gerada nos 8 primeiros bytes, o restante é constante.
A dica é essa, se quiser usar uniqueidentifier como chave primária de suas tabelas, use a função interna NEWSEQUENTIALID() do SQL Server para melhorar a performance e escabilidade das suas aplicações.
Só lembrando, ainda assim chaves primárias do tipo int ainda assim são mais performáticas, porém, seguindo a dica, a queda de performance não será percebida. Lembrando também que esses problemas de performance e escabilidade só são identificados quando sua base possuir muitos registros, lá na casa dos 300 mil, 500 mil, 1 milhão, ou seja, “coisa pra (b)aralho”.
Para aqueles que se perguntarem “se essa GUID não repete” a possibilidade é mínima. Matematicamente falando é mais facil ganhar na Megasena. NEWSEQUENTIALID() usa um algoritimo que para gerar a GUID se utiliza do MAC da placa de rede (que os fabricantes dizem nunca se repetir) e do DateTime da máquina.
Segue também uma leitura que eu recomendo descrevendo em mais detalhes o assunto!
[]´s
OBS:
Ainda não somos independentes mas pelo menos hoje é um ótimo dia para postar a nossa bandeira que é sem dúvida a mais bonita do mundo!