Index en cluster Mise à jour sur les colonnes non-cluster
-
16-10-2019 - |
Question
Utilisation: SQL Server 2008 R2
Je quitte actuellement à travers un plan d'exécution de la requête, et je suis venu dans une instance d'une mise à jour d'index ordonné en clusters sur une table. Le problème ici est que les colonnes qui sont mises à jour sont pas partie de l'index ordonné en clusters.
Tableau:
<table>
id INT IDENTITY(1,1) -- Clustered Index
, name VARCHAR(20) -- Nonclustered Index
, status CHAR(1)
, quantity INT
, price FLOAT
Déclaration de mise à jour:
UPDATE a
SET a.status = @status
, a.quantity = @quantity
, a.price = @price
FROM <table> a
WHERE a.name = @name
Le plan d'exécution montre une bobine Désireuse à 36% des coûts, une mise à jour index en cluster à 55% des coûts, et une recherche d'index sur l'index de nom à 9%, parmi les articles Compute Scalar et Top à 0% coût.
Pourquoi le plan montrant une mise à jour d'index ordonné en clusters? Que pouvais-je faire pour éviter cela, et d'empêcher la bobine avide?
La solution
Quand vous avez un index ordonné en clusters sur une table, l'index ordonné en clusters est la table!
Mentalement vous pouvez remplacer « table » pour « index cluster » dans ce cas et il sera logique.
Les données pour chaque champ dans chaque ligne est votre index ordonné en clusters. L'index ordonné en clusters définit simplement l'ordre des pages physiques dans la base de données organisée par votre clé de cluster (s).
Vous pouvez toujours retomber sur l'analogie de l'annuaire téléphonique pour ces choses aussi: dans votre annuaire téléphonique classique, les données sont regroupées sur Last Name, First Name
. Chaque entrée a encore PhoneNum, Address
au niveau des feuilles, mais vous ne commandez pas par là. Les pages sont en ordre physique par les touches.
Je ne peux pas donner des conseils sur l'optimisation de la requête à moins que vous nous montrez la table et la requête que vous utilisez, mais essentiellement ce coût sera payé d'une façon ou d'une autre. Si vous ne mettez pas à jour l'index cluster, il sera une mise à jour de table et une analyse de table.