Index clusterisé

Quel type d'index (en cluster / non clippered) doit être utilisé pour l'instruction Insert / Update / Delete dans SQL Server. Je sais que cela crée un surcoût supplémentaire, mais est-il meilleur en performance que la comparaison avec un indice non clusterisé? De même, quel index utiliser pour les instructions Select dans SQL Server?

Vous n'êtes pas sûr à 100% de ce que vous attendez: vous ne pouvez avoir qu'un seul index de clustering sur une table et, par défaut, chaque table (avec très peu d'exceptions de casse) doit en avoir une. Tous les index aident généralement vos SELECTs et certains ont tendance à blesser les INSERTs, DELETE et éventuellement UPDATEs (ou beaucoup, si mal choisi).

Un index clusterisé rend un tableau plus rapide, pour chaque opération. OUI! Cela fait. Voir l'excellent The Clustered Index Debate de Kim Tripp pour plus de détails. Elle mentionne également ses principaux critères pour un indice clusterisé:

  • étroit
  • statique (ne change jamais)
  • unique
  • si possible: toujours plus grand

INT IDENTITY répond parfaitement à cette exigence – les GUID ne le font pas. Voir GUID en tant que key primaire pour l'information de fond étendue.

Pourquoi étroit? Parce que la key de cluster est ajoutée à chaque page d'index de chaque index non clusterisé sur la même table (afin de pouvoir réellement searchr la ligne de données, si nécessaire). Vous ne voulez pas avoir VARCHAR (200) dans votre key de clustering ….

Pourquoi unique? Voir ci-dessus – la key de clustering est l'élément et le mécanisme que SQL Server utilise pour searchr de manière unique une ligne de données. Cela doit être unique. Si vous choisissez une key de clustering non unique, SQL Server appenda lui-même un caractère unique de 4 octets à vos keys. Faites attention à ça!

Next: indices non groupés. Fondamentalement, il y a une règle: toute key étrangère dans une table enfant référençant une autre table doit être indexée, cela accélérera les JOINs et d'autres opérations.

De plus, toutes les requêtes ayant des clauses WHERE sont un bon candidat – choisissez celles qui sont les premières exécutées. Placez les index sur les colonnes qui apparaissent dans les clauses WHERE, dans les instructions ORDER BY.

Ensuite: mesurez votre système, vérifiez les DMV (vues de gestion dynamic) pour get des indices sur les indices inutilisés ou manquants, et modifiez votre système encore et encore. C'est un process continu, vous n'aurez jamais fini!

Un autre avertissement: avec un chargement d'index, vous pouvez faire en sorte que n'importe quelle requête SELECT soit vraiment très rapide. Mais en même time, INSERT, UPDATE et DELETE qui doivent mettre à jour tous les indices impliqués pourraient en souffrir. Si vous ne choisissez jamais – allez écrous! Sinon, c'est un acte d'équilibre délicat et délicat. Vous pouvez toujours modifier une seule requête au-delà de la croyance – mais le rest de votre système pourrait en souffrir. Ne sur-indexez pas votre database! Mettez en place quelques bons indices, vérifiez et observez le comportement du système, puis ajoutez-en un ou deux, et encore une fois: observez comment la performance globale du système est affectée par cela.

Je ne suis pas sûr de ce que vous entendez par "devrait être utilisé pour insert / mettre à jour / supprimer une déclaration" mais à mon avis, chaque table devrait avoir un index clusterisé. L'index clusterisé spécifie l'ordre dans lequel datatables sont réellement stockées. Si un index cluster n'est pas défini, datatables seront simplement stockées dans un tas. Si vous n'avez pas de colonne naturelle pour servir d'index clusterisé, vous pouvez toujours créer une colonne d'identité comme int ou bigint comme ceci.

CREATE TABLE [dbo].[demo]( [ID] [int] IDENTITY(1,1) NOT NULL, [FirstName] [nchar](10) NULL, [LastName] [nchar](10) NULL, [Job] [nchar](10) NULL, CONSTRAINT [PK_demo] PRIMARY KEY CLUSTERED ( [ID] ASC ))