Где статистика, используемая оптимизатором запросов, физически хранится в файле базы данных SQL Server и в пуле буферов?
Более конкретно, есть ли способ выяснить страницы, используемые статистикой, используя DMV и / или DBCC?
У меня есть книги по внутренним компонентам и SQL Server 2008 Internals, а также по SQL Server Internals и устранению неполадок, и ни одна из них не говорит о физической структуре статистики; если они это сделают, я не смогу найти эту информацию.
STATS_STREAM
я никогда не изучал, находится ли это в самом файле.StatMan
), которая выводит большой двоичный объект (по иронии судьбы, это имя выделяется как функция в окне запроса SSMS). Логически, статистика связана с индексом или набором столбцов таблицы, поэтому я бы начал с изучения внутренних таблиц метаданных в поисках столбцаbinary
илиvarbinary
, который приведет к BLOB-объекту. Это должно быть доступно для просмотраDBCC PAGE
, но, вероятно, никак иначе, потому что все это внутреннее.sysindexes.statblob
но с 2005 года, который возвращается,NULL
и местоположение полностью недокументировано, только извлекаемое (что я знаю) до концаDBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
.sys.sysidxstats
- похоже, в этой таблице есть указатель большого объекта. Я не уверен, где находится статистика по столбцам; они могут быть в этой таблице, а также естьtype
столбец.Ответы:
Нашел их.
Создайте таблицу с простым объектом статистики.
Подключите с помощью ЦАП (
ADMIN:Server[\instance]
).Запустите следующие запросы:
Вы заметите, что
imageval
для каждого объекта статистики не то же самое, что у объекта статистики, но он содержит объект статистики - это просто смещение. В моей системе это дало это для x (я явно обрезал немало битов):И это для вас:
То же самое относится и к индексной статистике.
Вероятно, вы могли бы провести дальнейшую проверку этого с помощью ряда запросов с использованием
DBCC
команд. Сначала найдите страницы, связанные с кластерным индексомsys.sysobjvalues
(подставьте имя вашей базы данных):В результате вы получите список страниц, которые вам интересны
PageType = 1
. С новой базой данных вы сможете найти эту информацию на одной из страниц с самыми высокимиPagePID
значениями. Например, в моей системе это была страница 281, поэтому я посмотрел поближе на эту страницу:Конечно же, я нашел данные в слоте 17:
(В больших базах данных вам, возможно, придется выполнять гораздо больше операций поиска и клевания, поскольку нет гарантии, что даже новый объект статистики попадет на новую (er) страницу.)
Попробуйте это дома, но есть причина, по которой вам нужно подключиться к ЦАП. Мне, конечно, было бы интересно узнать, что вы собираетесь делать с этой информацией, которую вы не можете сделать с
DBCC SHOW_STATISTICS
выводом.Обратите внимание, что это, конечно, не пытается декодировать,
STATS_STREAM
чтобы предоставить гистограмму или другую информацию, и я не смог найти никаких доказательств того, что табличный выводDBCC SHOW_STATISTICS ... WITH HISTOGRAM
хранится где-либо в табличном формате. У Джо Чанга есть некоторая информация о декодировании, если это то, что вам нужно. Я не думаю, что это то, что вы хотели бы сделать в запросе - просто используйтеDBCC
.источник