查询优化器使用的统计信息物理存储在 SQL Server 数据库文件和缓冲池中的什么位置?
更具体地说,有没有办法使用 DMV 和/或 DBCC 找出统计数据使用的页面?
我拥有 SQL Server 2008 Internals 和 SQL Server Internals and Troubleshooting 书籍,但没有一本谈论统计的物理结构;如果他们这样做,我将无法找到此信息。
查询优化器使用的统计信息物理存储在 SQL Server 数据库文件和缓冲池中的什么位置?
更具体地说,有没有办法使用 DMV 和/或 DBCC 找出统计数据使用的页面?
我拥有 SQL Server 2008 Internals 和 SQL Server Internals and Troubleshooting 书籍,但没有一本谈论统计的物理结构;如果他们这样做,我将无法找到此信息。
找到他们。
使用简单的 stats 对象创建一个表。
使用 DAC (
ADMIN:Server[\instance]
) 连接。运行以下查询:
您会注意到,
imageval
每个 stats 对象与 stats blob 不同,但它确实包含stats blob - 它只是偏移量。在我的系统上,它为 x 产生了这个(我显然已经截断了相当多的位):这对于 y:
基于索引的统计数据也是如此。
您可能可以通过使用
DBCC
命令的一系列查询来进一步验证这一点。首先,找出与聚集索引有关的页面sys.sysobjvalues
(替换您的数据库名称):结果将列出一堆页面,您对
PageType = 1
. 使用新数据库,您应该能够在具有最高PagePID
值的页面之一上找到此信息。例如,在我的系统上这是第 281 页,所以我仔细查看了该页面:果然,我在slot 17中找到了数据:
(在较大的数据库中,您可能需要进行更多的搜索和检查,因为无法保证即使是新的统计数据对象也会出现在新的(呃)页面上。)
继续在家里尝试一下,但是您需要为此连接 DAC 是有原因的。当然,我很想知道,您将如何处理这些信息,而您无法使用
DBCC SHOW_STATISTICS
输出来处理这些信息。请注意,这当然不会尝试解码
STATS_STREAM
以提供直方图或其他信息,并且我找不到任何证据表明表格输出DBCC SHOW_STATISTICS ... WITH HISTOGRAM
以表格格式存储在任何地方。Joe Chang 有一些关于解码的信息,如果那是你所追求的。我不认为这是您想要在查询中执行的操作 - 只需使用DBCC
.