統計資訊物理儲存在 SQL Server 的什麼位置?
查詢優化器使用的統計資訊物理儲存在 SQL Server 數據庫文件和緩衝池中的什麼位置?
更具體地說,有沒有辦法使用 DMV 和/或 DBCC 找出統計數據使用的頁面?
我擁有 SQL Server 2008 Internals 和 SQL Server Internals and Troubleshooting 書籍,但沒有一本涉及統計數據的物理結構;如果他們這樣做,我將無法找到此資訊。
找到他們。
- 使用簡單的 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);
果然,我在slot 17中找到了數據:
(在較大的數據庫中,您可能需要進行更多的搜尋和檢查,因為無法保證即使是新的統計數據對像也會出現在新的(呃)頁面上。)
繼續在家裡嘗試一下,但是您需要為此連接 DAC 是有原因的。當然,我很想知道,您將如何處理這些資訊,而您無法使用
DBCC SHOW_STATISTICS
輸出來處理這些資訊。請注意,這當然不會嘗試解碼
STATS_STREAM
以提供直方圖或其他資訊,並且我找不到任何證據表明表格輸出DBCC SHOW_STATISTICS ... WITH HISTOGRAM
以表格格式儲存在任何地方。Joe Chang 有一些關於解碼的資訊,如果那是你所追求的。我不認為這是您想要在查詢中執行的操作 - 只需使用DBCC
.