Les deux tables ont la même structure et 19972 lignes dans chaque table. pour pratiquer l'indexation, j'ai créé les deux tables ayant la même structure et créé
clustered index on persontb(BusinessEntityID)
et
nonclustered index on Persontb_NC(BusinessEntityId)
et structure de table
BusinessEntityID int
FirstName varchar(100)
LastName varchar(100)
-- Nonclusted key on businessentityid takes 38%
SELECT BusinessEntityId from Persontb_NC
WHERE businessentityid BETWEEN 400 AND 4000
-- CLustered key businessentityid takes 62%
SELECT BusinessEntityId from persontb
WHERE businessentityid BETWEEN 400 AND 4000
Pourquoi l'index clusterisé prend 62% et non clusterisé 38%?
Réponses:
Oui, l'index cluster a moins de lignes par page que l'index non cluster car les pages feuilles de l'index cluster doivent stocker les valeurs des deux autres colonnes (
FirstName
etLastName
).Les pages feuilles du NCI ne stockent que les
BusinessEntityId
valeurs et un localisateur de lignes (RID si la table est un tas ou la clé CI sinon).Les coûts estimés reflètent donc le plus grand nombre de lectures et les besoins d'E / S.
Si vous deviez déclarer le NCI
il serait alors similaire à l'index clusterisé.
la source
L'index clusterisé contient non seulement les données de l'index de colonne, mais également les données de toutes les autres colonnes. (Il ne peut y avoir qu'un seul index cluster par table)
L'index non cluster contient uniquement les données des colonnes indexées et un pointeur row_id vers l'emplacement du reste des données.
Par conséquent, cet index non cluster particulier est plus léger et moins de lecture est nécessaire pour le parcourir / le rechercher et cette requête particulière fonctionnera plus rapidement.
Cependant, si vous avez également essayé de récupérer FirstName et LastName, ce serait différent et l'index cluster devrait mieux fonctionner.
la source
Les pourcentages entre les plans de requête n'ont aucun sens à comparer purement et simplement. Vous devez comparer les requêtes pour avoir une comparaison valide. En outre, les petits nombres de lignes ont tendance à masquer les différences de performances entre les stratégies d'indexation. En augmentant le nombre de lignes à 10 millions, vous pouvez obtenir une image plus claire des différences de performances.
Il existe un exemple de script qui crée 3 tables, vos deux d'en haut et une troisième avec un index cluster et non cluster.
Remplissez les tables avec 10 millions de lignes
Nous pouvons utiliser sys.dm_db_index_physical_stats pour voir la taille sur disque des index.
Et les résultats:
L'index cluster de T1 mesure environ 1,6 Go. L'indice non clusterisé de T2 est de 170 Mo (90% d'économie d'E / S). L'indice non cluster de T3 est de 97 Mo, soit environ 95% d'E / S en moins que T1.
Ainsi, basé sur les E / S requises, le plan de requête d'origine aurait dû être plus proche de 10% / 90%, et non 38% / 62%. De plus, étant donné que l'index non clusterisé est susceptible de tenir entièrement en mémoire, la différence peut être encore plus grande, car les E / S disque sont très coûteuses.
la source
10%/90%
chiffre est plus précis que le38%/62%
. Les chaînes d'une longueur comprise entre 100 et 200 constitueront certainement une surestimation brute des besoins en espace pour une paire prénom / nom, vous aurez donc une densité de page inférieure à celle de l'OP. Lorsque j'essaie par rapport à vos données d'exemple, les coûts estimés sont de 87% / 13% .data_pages
insys.allocation_units
. Vous pouvez le voir à partir deCREATE TABLE T1(C INT);CREATE TABLE T2(C INT);UPDATE STATISTICS T1 WITH PAGECOUNT = 1;UPDATE STATISTICS T2 WITH PAGECOUNT = 100
là en comparant les coûts estimésSELECT * FROM T1;SELECT * FROM T2;