Sql-Server

統計資訊物理儲存在 SQL Server 的什麼位置?

  • May 8, 2020

查詢優化器使用的統計資訊物理儲存在 SQL Server 數據庫文件和緩衝池中的什麼位置?

更具體地說,有沒有辦法使用 DMV 和/或 DBCC 找出統計數據使用的頁面?

我擁有 SQL Server 2008 Internals 和 SQL Server Internals and Troubleshooting 書籍,但沒有一本涉及統計數據的物理結構;如果他們這樣做,我將無法找到此資訊。

找到他們。

  1. 使用簡單的 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
  1. 使用 DAC ( ADMIN:Server[\instance]) 連接。
  2. 執行以下查詢:
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中找到了數據:

DBCC 頁面的部分結果

(在較大的數據庫中,您可能需要進行更多的搜尋和檢查,因為無法保證即使是新的統計數據對像也會出現在新的(呃)頁面上。)

繼續在家裡嘗試一下,但是您需要為此連接 DAC 是有原因的。當然,我很想知道,您將如何處理這些資訊,而您無法使用DBCC SHOW_STATISTICS輸出來處理這些資訊。

請注意,這當然不會嘗試解碼STATS_STREAM以提供直方圖或其他資訊,並且我找不到任何證據表明表格輸出DBCC SHOW_STATISTICS ... WITH HISTOGRAM以表格格式儲存在任何地方。Joe Chang 有一些關於解碼的資訊,如果那是你所追求的。我不認為這是您想要在查詢中執行的操作 - 只需使用DBCC.

引用自:https://dba.stackexchange.com/questions/27151