Question

Je suis assez bien versé dans SQL Server performace mais je dois faire valoir constanly bas l'idée que GUIDs devraient être utilisés comme type par défaut pour les clusterd clés primaires.

En supposant que la table a une quantité assez faible d'inserts par jour (5000 +/- lignes / jour), quel genre de problèmes de performace pourrions nous rencontrer? Comment se divise page affecte notre recherche la performance? À quelle fréquence je réindexer (ou devrais-je défragmenter)? Que dois-je définir les facteurs de remplissage à (100, 90, 80, ect)?

Et si je 1.000.000 lignes par l'insertion de jour?

Je me excuse beforhand pour toutes les questions, mais je suis à la recherche d'obtenir une sauvegarde pour ne pas utiliser notre GUIDs par défaut pour PKs. Je suis cependant tout à fait ouvert à ce que mon esprit a changé par la connaissance overwehlming de la base d'utilisateurs StackOverflow.

Était-ce utile?

La solution

Si vous faites une sorte de volume sont extrêmement mauvais GUIDs comme PK mauvais sauf si vous utilisez GUIDs séquentielle , pour les raisons exactes que vous décrivez. fragmentation page est grave :

                 Average                    Average
                 Fragmentation  Fragment    Fragment   Page     Average 
Type             in Percent     Count       Size       Count    Space Used

id               4.35           7           16.43      115      99.89
newidguid        98.77          162         1          162      70.90 
newsequentualid  4.35           7           16.43      115      99.89

Et comme cette comparaison entre GUIDs et entiers montre:

  

fait une quantité Test1 énorme de fractionnements, et avait une densité de balayage autour de 12% quand je courais un DBCC SHOWCONTIG après que les inserts avaient terminé. Le tableau ci-Test2 avait une densité de balayage environ 98%

Si votre volume est très faible, cependant, il n'a pas d'importance tant que ça.

Si vous avez vraiment besoin d'une pièce d'identité unique au monde, mais ont un volume élevé (et ne peut pas utiliser des ID séquentiels), il suffit de mettre les GUIDs dans une colonne indexée.

Autres conseils

GUID inconvénients de l'utilisation comme clé primaire:

  • Pas de commande significative, des moyens d'indexation ne donne pas gain de performances comme il le fait avec un entier.
  • taille d'un GUID de 16 octets, par rapport à 2, 4 ou 8 octets pour un nombre entier.
  • Très difficile pour l'homme de se rappeler, donc pas bon comme identifiant de référence.

Avantages:

  • Permettre les clés primaires non devinables qui peuvent donc être moins dangereux lorsqu'il est affiché dans une chaîne de requête de page Web ou dans l'application.
  • Utile dans les bases de données qui ne fournissent pas un type de données d'incrémentation automatique ou identité.
  • utile lorsque vous devez joindre des données entre deux sources de données disparates sur toutes les plateformes ou les environnements.

Je pensais que la décision de savoir si l'utilisation était assez simple GUIDs, mais peut-être que je ne suis pas au courant d'autres questions.

Avec un tel bas inserts par jour, je doute que le partage de la page doit être un facteur important. La vraie question est de savoir comment 5000 se compare à la ligne existante de nombre, car ce serait les principales informations nécessaires pour décider d'un facteur de remplissage initial approprié Deffer divise.

Cela dit, je ne suis pas personnellement un grand fan de GUIDs. Je comprends qu'ils peuvent servir dans certains contextes, mais dans de nombreux cas, ils ne sont que « la manière » [d'efficacité, de facilité d'utilisation, de ...]

Je trouve les questions suivantes utiles pour limiter le décider si GUID doit être utilisé ou non.

  • Est-ce que le PK sera partagé / publié? (Ce seront-elles utilisées au-delà de son utilisation interne au sein de SQL, auront besoin de ces applications clés d'une manière quelque peu persistante? Est-ce les utilisateurs voient en quelque sorte ces clés?
  • pourrait le PK être utilisé pour aider à fusionner des sources de données disparates?
  • Est-ce que la table a une composite- -possibly primaire fait de la colonne (s) dans les données? Quelle est la taille de ce possible cette touche
  • Comment les clés primaires trier? Si composite, sont les premières colonnes sélectives?

L'utilisation d'un guid (à moins qu'il soit un GUID séquentiel) comme un index cluster va tuer les performances d'insertion. Depuis la mise en page de table physique est aligné en fonction de l'index cluster, en utilisant un guid qui a un ordre de séquençage aléatoire provoque la fragmentation grave de table. Si vous souhaitez utiliser un guid comme PK / index en cluster, il doit être un guid séquentiel en utilisant la fonction newsequentialid () dans le serveur SQL. Cela garantira que les GUIDs générés sont ordonnés de façon séquentielle et éviter la fragmentation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top