¿Dónde se almacenan físicamente las estadísticas utilizadas por el optimizador de consultas dentro de un archivo de base de datos de SQL Server y el grupo de búferes?
Más específicamente, ¿hay alguna forma de averiguar las páginas utilizadas por las estadísticas usando DMV y / o DBCC?
Poseo los libros internos de SQL Server 2008 y los internos de SQL Server y Solución de problemas y ninguno de ellos habla sobre la estructura física de las estadísticas; si lo hacen, no podré encontrar esta información.
STATS_STREAM
archivo binario que nunca he investigado si esto es algo que se puede encontrar en el archivo.StatMan
) que genera un blob (irónicamente, ese nombre se resalta como una función en una ventana de consulta SSMS). Lógicamente, las estadísticas están asociadas con un índice o un conjunto de columnas de tabla, por lo que comenzaría examinando las tablas de metadatos internos en busca de una columnabinary
ovarbinary
columna que conduzca al blob. Esto debería ser visible usandoDBCC PAGE
, pero probablemente no de otra manera porque es todo interno.sysindexes.statblob
pero desde 2005 eso regresaNULL
y la ubicación está completamente indocumentada, solo recuperable (que yo sepa) a travésDBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
.sys.sysidxstats
, parece que hay un puntero LOB en esa tabla. Todavía no estoy seguro de dónde están las estadísticas de la columna; podrían estar en esa mesa y hay unatype
columna.Respuestas:
Los encontré.
Crea una tabla con un simple objeto de estadísticas.
Conéctese utilizando el DAC (
ADMIN:Server[\instance]
).Ejecute las siguientes consultas:
Notarás que
imageval
para cada objeto de estadísticas no es lo mismo que el blob de estadísticas, pero contiene el blob de estadísticas, es solo un desplazamiento. En mi sistema produjo esto para x (obviamente he truncado un poco de bits):Y esto para ti:
Lo mismo era cierto para las estadísticas basadas en índices.
Probablemente podría hacer una mayor validación de esto con una serie de consultas utilizando
DBCC
comandos. Primero, descubra las páginas que están involucradas con el índice agrupado ensys.sysobjvalues
(sustituya el nombre de su base de datos):El resultado enumerará un montón de páginas, en las que está interesado
PageType = 1
. Con una nueva base de datos, debería poder encontrar esta información en una de las páginas con losPagePID
valores más altos. Por ejemplo, en mi sistema, esta era la página 281, así que miré más de cerca esa página:Efectivamente, encontré los datos en la ranura 17:
(En bases de datos más grandes, es posible que tenga que cazar y picotear mucho más, ya que no hay garantía de que incluso un nuevo objeto de estadísticas termine en una nueva página (er)).
Siga adelante e intente esto en casa, pero hay una razón por la que necesita conectarse con el DAC para esto. Me gustaría saber, por supuesto, qué harás con esta información que no podrías hacer con la
DBCC SHOW_STATISTICS
salida.Tenga en cuenta que esto, por supuesto, no intenta decodificar el
STATS_STREAM
para proporcionar histograma u otra información, y no pude encontrar ninguna evidencia de que la salida tabular deDBCC SHOW_STATISTICS ... WITH HISTOGRAM
se almacena en cualquier lugar en formato de tabla. Joe Chang tiene información sobre la decodificación si eso es lo que buscas. No creo que sea algo que quiera hacer en una consulta, solo useDBCC
.fuente