Où les statistiques utilisées par l'Optimiseur de requête sont-elles physiquement stockées dans un fichier de base de données SQL Server et le pool de tampons?
Plus précisément, existe-t-il un moyen de comprendre les pages utilisées par les statistiques à l'aide de DMV et / ou DBCC?
Je possède à la fois des livres sur SQL Server 2008 Internals et SQL Server Internals and Troubleshooting et aucun d'eux ne parle de la structure physique des statistiques; s'ils le font, je ne pourrai pas trouver cette information.
STATS_STREAM
je n'ai jamais vérifié si c'est quelque chose de trouvable dans le fichier lui-même.StatMan
) qui génère un blob (ironiquement, ce nom est mis en surbrillance en tant que fonction dans une fenêtre de requête SSMS). Logiquement, les statistiques sont associées à un index ou à un ensemble de colonnes de table, donc je commencerais par examiner les tables de métadonnées internes à la recherche d'une colonnebinary
ouvarbinary
qui mènera au blob. Cela devrait être visible en utilisantDBCC PAGE
, mais probablement pas autrement, car tout est interne.sysindexes.statblob
mais depuis 2005, il revientNULL
et l'emplacement est complètement non documenté, uniquement récupérable (à ma connaissance) viaDBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
.sys.sysidxstats
- il semble qu'il y ait un pointeur LOB dans cette table. Je ne sais pas encore où sont les statistiques de la colonne; ils pourraient être dans ce tableau ainsi qu'il y a unetype
colonne.Réponses:
Je les ai trouvés.
Créez une table avec un simple objet stats.
Connectez-vous à l'aide du DAC (
ADMIN:Server[\instance]
).Exécutez les requêtes suivantes:
Vous remarquerez que
imageval
pour chaque objet stats, ce n'est pas la même chose que le blob stats, mais il contient le blob stats - il est juste décalé. Sur mon système, cela a produit ceci pour x (j'ai évidemment tronqué pas mal de bits):Et cela pour y:
Il en va de même pour les statistiques indexées.
Vous pourriez probablement faire une validation supplémentaire de cela avec une série de requêtes à l'aide de
DBCC
commandes. Tout d'abord, recherchez les pages concernées par l'index clusterisésys.sysobjvalues
(remplacez le nom de votre base de données):Le résultat listera un tas de pages, celles qui vous intéressent
PageType = 1
. Avec une nouvelle base de données, vous devriez pouvoir trouver ces informations sur l'une des pages avec lesPagePID
valeurs les plus élevées. Par exemple, sur mon système, c'était la page 281, alors j'ai regardé de plus près cette page:Effectivement, j'ai trouvé les données dans l'emplacement 17:
(Sur des bases de données plus grandes, vous devrez peut-être faire beaucoup plus de chasse et de picage, car il n'y a aucune garantie que même un nouvel objet de statistiques se retrouvera sur une nouvelle (er) page.)
Allez-y et essayez ceci à la maison, mais il y a une raison pour laquelle vous devez vous connecter avec le DAC pour cela. Je serais curieux de savoir, bien sûr, ce que vous allez faire de ces informations que vous ne pourriez pas faire avec la
DBCC SHOW_STATISTICS
sortie.Notez que cela n'essaie bien sûr pas de décoder le
STATS_STREAM
pour fournir un histogramme ou d'autres informations, et je n'ai trouvé aucune preuve que la sortie tabulaire deDBCC SHOW_STATISTICS ... WITH HISTOGRAM
est stockée n'importe où au format tableau. Joe Chang a des informations sur le décodage si c'est ce que vous recherchez. Je ne pense pas que ce soit quelque chose que vous voudriez faire dans une requête - utilisez simplementDBCC
.la source