找到他们。
创建一个带有简单stats对象的表。
CREATE DATABASE splunge;
GO
USE splunge;
GO
CREATE TABLE dbo.foo(bar INT, munge INT);
GO
CREATE STATISTICS x ON dbo.foo(bar);
CREATE STATISTICS y ON dbo.foo(munge);
GO
INSERT dbo.foo SELECT s1.[object_id], s2.[object_id]
FROM sys.objects AS s1
CROSS JOIN sys.objects AS s2;
GO
UPDATE STATISTICS dbo.foo;
GO
使用DAC(ADMIN:Server[\instance]
)连接。
运行以下查询:
DBCC SHOW_STATISTICS('dbo.foo', 'x') WITH STATS_STREAM;
DBCC SHOW_STATISTICS('dbo.foo', 'y') WITH STATS_STREAM;
SELECT name, imageval
FROM sys.stats AS s
INNER JOIN sys.sysobjvalues AS o
ON s.object_id = o.objid
AND s.stats_id = o.subobjid
WHERE
s.object_id = OBJECT_ID('dbo.foo');
您会注意到,imageval
对于每个stats对象,它与stats blob不同,但是它确实包含 stats blob-只是偏移量。在我的系统上,它产生了x(显然我已经截断了很多位):
0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
0x07000000C4E1BE00EEA0...rest the same
这对于y:
0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
0x07000000C7E1BE00EEA0...rest the same
基于索引的统计数据也是如此。
您可能可以使用DBCC
命令通过一系列查询来对此做进一步验证。首先,找出与群集索引有关的页面sys.sysobjvalues
(替换您的数据库名称):
DBCC IND('splunge', 'sys.sysobjvalues', 1);
结果将列出一堆页面,您对中的页面感兴趣PageType = 1
。使用新的数据库,您应该能够在具有最高PagePID
值的页面之一上找到此信息。例如,在我的系统上,这是第281页,因此我仔细查看了该页面:
DBCC TRACEON(3604);
DECLARE @dbid INT = DB_ID();
DBCC PAGE(@dbid, 1, 281, 3);
DBCC TRACEOFF(3604);
果然,我在插槽17中找到了数据:
(在较大的数据库上,您可能不得不做更多的工作,因为无法保证即使是新的统计信息对象也将最终出现在新的(er)页面上。)
继续尝试在家中进行此操作,但是有一个原因需要为此与DAC连接。我很想知道,当然,您将如何处理这些信息,而DBCC SHOW_STATISTICS
输出却无法做到这一点。
请注意,这当然不会尝试对进行解码STATS_STREAM
以提供直方图或其他信息,并且我找不到任何证据证明其表格输出DBCC SHOW_STATISTICS ... WITH HISTOGRAM
以表格式存储在任何地方。如果您要这样做,Joe Chang会提供一些有关解码的信息。我认为这不是您要在查询中执行的操作-只需使用即可DBCC
。
STATS_STREAM
我从未调查过它是否可以在文件本身中找到。