2010-01-08 2 views
0

Je sais que l'utilisation du GUID généré par newid n'est pas un bon candidat pour les problèmes de performances.Clé primaire composite utilisant newid et newsequentialid

Que diriez-vous d'une clé primaire composée avec {newsequentialid(), newid()} ainsi un nouveau GUID est garanti pour être plus grand que celui généré précédemment?

Existe-t-il également un problème de performances?

Vous pensez peut-être pourquoi quelqu'un faire cela, mais je vous écris une règle d'analyse de code et ne sais pas ce que les choses folles que les utilisateurs vont faire :)

Merci

Répondre

4

Cela est encore pire qu'un droit , GUID unique créé en utilisant simplement newid().

Pourquoi?

  • il est toujours totalement aléatoire (à cause de la partie newid()) provoquant ainsi la fragmentation des index massif
  • il est deux fois plus grand que un seul GUID, faisant tous vos indices non-cluster plus pléthorique et moins efficace (32 octets par rapport à 4 octets pour une INT IDENTITY)

Je recommande donc soit:

  • bâton avec juste un newsequentialid() comme valeur par défaut pour votre PK, si vous voulez vraiment et n EED un PK
  • style GUID
  • utiliser un INT/BIGINT IDENTITÉ pour des performances optimales (si la réplication est pas une exigence)

Ce sont les deux meilleurs choix que vous avez. Voir d'excellents articles de Kimberly Tripp pourquoi un GUID aléatoire est un choix vraiment très mauvais pour une clé de cluster:

+0

... et newsequentialid ne continuera pas la séquence après un redémarrage de l'instance SQL ... – gbn

Questions connexes