Tìm thấy chúng.
Tạo một bảng với một đối tượng thống kê đơn giản.
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
Kết nối bằng cách sử dụng DAC ( ADMIN:Server[\instance]
).
Chạy các truy vấn sau:
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');
Bạn sẽ lưu ý rằng imageval
đối với mỗi đối tượng thống kê không giống với blob thống kê, nhưng nó chứa blob thống kê - nó chỉ là phần bù. Trên hệ thống của tôi, nó mang lại giá trị này cho x (Tôi rõ ràng đã cắt bớt một chút bit):
0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
0x07000000C4E1BE00EEA0...rest the same
Và điều này cho y:
0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
0x07000000C7E1BE00EEA0...rest the same
Điều này cũng đúng với thống kê dựa trên chỉ số.
Bạn có thể có thể xác nhận thêm về điều này với một loạt các truy vấn bằng cách sử dụng DBCC
các lệnh. Trước tiên, hãy tìm hiểu các trang có liên quan đến chỉ mục được nhóm trên sys.sysobjvalues
(thay thế tên cơ sở dữ liệu của bạn):
DBCC IND('splunge', 'sys.sysobjvalues', 1);
Kết quả sẽ liệt kê một loạt các trang, bạn quan tâm đến những trang của PageType = 1
. Với cơ sở dữ liệu mới, bạn sẽ có thể tìm thấy thông tin này trên một trong những trang có PagePID
giá trị cao nhất . Ví dụ, trên hệ thống của tôi, đây là trang 281, vì vậy sau đó tôi nhìn kỹ hơn vào trang đó:
DBCC TRACEON(3604);
DECLARE @dbid INT = DB_ID();
DBCC PAGE(@dbid, 1, 281, 3);
DBCC TRACEOFF(3604);
Chắc chắn, tôi tìm thấy dữ liệu trong khe 17:
(Trên các cơ sở dữ liệu lớn hơn, bạn có thể phải săn lùng và mổ xẻ nhiều hơn, vì không có gì đảm bảo rằng ngay cả một đối tượng thống kê mới sẽ kết thúc trên một trang (er) mới.)
Hãy tiếp tục và thử điều này ở nhà, nhưng có một lý do bạn cần kết nối với DAC cho việc này. Tất nhiên, tôi tò mò muốn biết những gì bạn sẽ làm với thông tin này mà bạn không thể làm với DBCC SHOW_STATISTICS
đầu ra.
Lưu ý rằng điều này tất nhiên không cố gắng giải mã STATS_STREAM
biểu đồ để cung cấp biểu đồ hoặc thông tin khác và tôi không thể tìm thấy bất kỳ bằng chứng nào cho thấy đầu ra dạng bảng DBCC SHOW_STATISTICS ... WITH HISTOGRAM
được lưu trữ ở bất cứ đâu trong định dạng bảng. Joe Chang có một số thông tin về giải mã nếu đó là những gì bạn đang theo đuổi. Tôi không nghĩ đó là điều bạn muốn làm trong một truy vấn - chỉ cần sử dụng DBCC
.
STATS_STREAM
mà tôi chưa bao giờ xem xét liệu đây có phải là thứ có thể tìm thấy trong chính tệp đó không.