Sql-Server

SQL Server 統計對像中的數字是什麼數據類型?

  • June 5, 2017

具體來說,我最感興趣的是:

  • 密度向量中的“所有密度”數
  • 直方圖中的數字

例如,它們是浮點數/小數嗎?他們有什麼精度/比例/長度

這樣做的動機是我認為我可能會看到舍入錯誤,所以想知道我們應該期望基數估計與這些統計數據匹配的精確度。

我很樂意為任何版本的 SQL Server 提供答案,但 2012 和 2014 與我最相關。

下面是 SQL Server 報告的每個結果集的欄位名稱和數據類型(我在 SQL Server 2012、2014 和 2016 上進行了測試,儘管我希望這些在 SQL Server 版本中保持一致):

DBCC SHOW_STATISTICS() WITH STAT_HEADER

[Name]                  NVARCHAR(128)
[Updated]               NVARCHAR(20)
[Rows]                  BIGINT
[Rows Sampled]          BIGINT
[Steps]                 SMALLINT
[Density]               REAL
[Average key length]    REAL
[String Index]          NCHAR(3)
[Filter Expression]     NVARCHAR(MAX)
[Unfiltered Rows]       BIGINT

DBCC SHOW_STATISTICS() WITH DENSITY_VECTOR

[All density]           REAL
[Average Length]        REAL
[Columns]               NVARCHAR(4000)

DBCC SHOW_STATISTICS() WITH HISTOGRAM

[RANGE_HI_KEY]          INT -- Datatype varies based on datatype of first key column
[RANGE_ROWS]            REAL
[EQ_ROWS]               REAL
[DISTINCT_RANGE_ROWS]   BIGINT
[AVG_RANGE_ROWS]        REAL

需要明確的是,這些數據類型是來自DBCC命令的結果集數據類型;沒有指示用於儲存該資訊的實際數據類型。但是,假設結果集的數據類型與用於儲存資訊的數據類型相同似乎是合理的。

此外,對於任何對我如何能夠確定這些數據類型感到好奇的人:我從作為SQL#庫的一部分創建的 SQLCLR 儲存過程中獲得了資訊。它被稱為DB_DescribeResultSets並且類似於sys.dm_exec_describe_first_result_set但處理多個結果集、臨時表、動態 SQL 等(因為它執行查詢而不是僅僅解析它)。但是,免費版本中不提供**DB_DescribeResultSets儲存過程。**但是,您可以在任何 .NET 應用程序中執行相同的操作。它只需要通過 a 執行查詢SqlDataReader,然後使用GetSchemaTable方法來獲取結果集架構。

我執行DB_DescribeResultSets如下:

EXEC SQL#.DB_DescribeResultSets
 @TheQuery = N'DBCC SHOW_STATISTICS(N''msdb.dbo.sysjobs'',
                                    nc1);',
 @RowNumberToGetValuesFrom = 1,
 @ResultSetNumberToDescribe = 0, -- 0 = all result sets
 @ShowHiddenFields = 1,
 @ResultSet = ''; -- this is an XML OUTPUT param and can't have a default in SQLCLR

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