2017-03-02 1 views
0

J'ai une table avec environ 40 millions de lignes. Cette table est un tas et possède plusieurs index non clusterisés. J'ai toujours pensé que 1 rangée ne pouvait avoir qu'un seul aller chercher.Récupération des extractions dans la table de segments

J'ai exécuté sp_blitzindex de Brent Ozar pour diagnostiquer les problèmes de performance actuels. Selon sp_blitzindex, ce tas a plus de 5 milliards d'envois retransmis (...).

Quelqu'un peut-il expliquer s'il vous plaît comment c'est possible? Je ne cherche pas de considérations de conception, juste une explication sur la façon dont cela fonctionne. Merci beaucoup! Cordialement, SQL_M.

+0

L'article utilisé comme source par une réponse maintenant supprimé n'est pas un mauvais endroit pour commencer - http://sqlmag.com/stored-procedures/ remove-forwarded-records-heap-tables - chaque colonne de longueur variable d'une ligne peut avoir une recherche directe. –

+0

Merci Ed, je vais lire l'article. –

Répondre

1

Fragmentation logique.

Il était une fois: la rangée 1 était à côté de la rangée 2, était à côté de la rangée 3, etc. sur la même page. Cela aurait été le cas lors de l'insertion initiale.

Au fil du temps, la ligne 2 a été mise à jour (disons qu'une colonne varchar a doublé en nombre de caractères stockés). La ligne 2 aurait été déplacée vers une nouvelle page pour éviter de déplacer 39 999 998 lignes "vers le bas".

Pour contrer cela, les pointeurs ont été créés à partir de la ligne 1 à la ligne 2 nouvel emplacement, puis retour à la ligne 3.

Répétez plus de 40 millions de lignes sans index ordonné en clusters qui signifie aucun moyen de défragmenter les données disque, et vous facilement à 5 milliards

I para-phrased Brent

+0

Merci d'avoir répondu, c'est clair maintenant. –