Clés GUID : séparer identité publique et clustering
Évaluez largeur des GUID, insertions aléatoires et contention séquentielle, puis comparez GUID public et clé interne étroite.
Un identifiant globalement unique peut convenir comme identifiant public sans être la meilleure clé cluster. L'identité publique sert l'intégration et la distribution ; le clustering influence localité, taille des index et insertions dans une table. Ce sont deux décisions différentes.
Mesurer le bon coût
uniqueidentifier occupe seize octets, bigint huit. Dans une table rowstore clusterisée, la clé cluster sert aussi de localisateur aux index non cluster. Une clé large peut donc augmenter le stockage au-delà de la table principale. L'effet dépend des index, de la compression et de la forme des lignes.
NEWID répartit les insertions dans l'espace des clés. Une page cible pleine peut entraîner du travail supplémentaire et des divisions. Une clé croissante peut au contraire concentrer la contention sur la dernière page. Répartir et concentrer l'activité ont chacun des conséquences ; aucune approche ne gagne pour toutes les charges.
Le schéma d'exercice sépare une clé interne étroite d'un GUID public unique. Utilisez une base jetable. C'est une option à mesurer, pas une recommandation de migrer toutes les tables.
CREATE TABLE dbo.KeyDesignDemo
( InternalId bigint IDENTITY(1,1) NOT NULL
CONSTRAINT PK_KeyDesignDemo PRIMARY KEY CLUSTERED,
PublicId uniqueidentifier NOT NULL DEFAULT NEWID(),
CreatedAt datetime2(3) NOT NULL DEFAULT SYSUTCDATETIME(),
Payload nvarchar(200) NOT NULL,
CONSTRAINT UQ_KeyDesignDemo_PublicId UNIQUE NONCLUSTERED(PublicId)
);
INSERT dbo.KeyDesignDemo(Payload) VALUES(N'example');
SELECT InternalId,PublicId FROM dbo.KeyDesignDemo;
Une recherche PublicId utilise l'index non cluster unique puis peut devoir retrouver Payload dans la table. Si seul InternalId est nécessaire, cette lecture supplémentaire peut être évitée. Ajoutez des colonnes incluses seulement lorsque leur bénéfice justifie stockage et écritures.
Limites des GUID séquentiels
NEWSEQUENTIALID peut réduire le caractère aléatoire lorsqu'il sert de valeur par défaut à une colonne uniqueidentifier. Il ne remplace pas NEWID dans toute expression. Son ordre après redémarrage ou changement de machine ne constitue pas une horloge métier. L'identifiant ne doit pas non plus servir de secret d'autorisation.
La séquentialité ne réduit pas les seize octets. Elle peut déplacer la pression vers une zone d'insertion chaude. Distinguez attentes de latches, blocages transactionnels et attentes de stockage. Une modification contre la fragmentation ne résout pas nécessairement la contention de dernière page.
Le fill factor réserve de l'espace à la construction, sans maintenir éternellement ce pourcentage libre. Le diminuer peut réduire certaines divisions tout en augmentant pages et lectures. Choisissez selon la croissance mesurée plutôt qu'une règle appliquée à tous les index.
Comparer la charge entière
Mesurez insertions concurrentes, recherches publiques, jointures internes et rapports par plage. Comparez taille totale, journal, activité des pages, débit et latence extrême. Accélérer l'insertion en rendant les recherches habituelles plus coûteuses ne garantit pas un gain global.
Changer une clé cluster existante est une migration structurelle. Inventoriez clés étrangères, index dépendants, réplication et hypothèses applicatives. Ajouter InternalId ne redirige pas les relations GUID existantes. Décidez explicitement quelles références conservent le GUID et lesquelles utilisent la clé interne.
Pour des écrivains distribués, précisez la génération et la fusion des identifiants. Une identité locale n'est pas globalement unique. Garder un identifiant externe unique peut préserver le contrat d'intégration tout en conservant une clé locale.
Testez bascule, import massif, suppressions suivies d'insertions et données dépassant le cache. Les permissions restent nécessaires même si un identifiant est difficile à deviner. Mesurez également le coût d'entretien de l'index supplémentaire. La conclusion doit reposer sur la charge réelle, pas sur une règle universelle contre les GUID ou en faveur de la séquentialité.
Références techniques: Microsoft Learn: Index design · Microsoft Learn: NEWSEQUENTIALID.