Sql-Server

獲取 MS SQL Server 中列的 NULL 統計資訊

  • November 3, 2011

在 MS SQL Server 2005 中,如何提取有關給定列的 NULL 分數(或 NULL 計數)的統計資訊?

Oracle 和 PostgreSQL 都有相同的資訊,聽說 MS SQL 也有統計資訊,但不知道在哪裡可以找到。Google沒有太大幫助。

我希望我會聽到類似的東西

SELECT null_frac FROM pg_stats WHERE tablename='mytab' and attname='mycol';
/* PostgreSQL, stats gathered by ANALYZE */

要麼

SELECT nullcnt FROM custom_stats_table WHERE tabname='MYTAB' and colname='MYCOL';
/* Oracle, stats gathered by dbms_stats.get_column_stats */

我不是在問如何自己計算這些值——我知道該怎麼做。我需要數千列的這些統計資訊,並且在我正在處理的數據庫上計算這將花費很長時間。我需要近似值,它們應該位於伺服器中的某個位置 - 基於成本的優化器無論如何都需要它們。

沒有那麼容易。您需要使用DBCC SHOW_STATISTICS並查看直方圖,考慮到統計資訊可能被過濾或多列。

可能更容易讓 SQL Server 執行此操作並為語句生成估計的執行計劃,select * from foo where bar is null然後如果它們存在,SQL Server 將使用適當的統計資訊,如果不存在則創建它們(假設啟用了自動創建統計資訊選項)。

然後,您可以查看進入SELECT迭代器的估計行數(這StatementEstRows在 XML 中顯示,以便以程式方式解析)

範常式式碼

/*Create temporary stored procedure with query of interest*/
CREATE PROC dbo.#plan_test
AS
SELECT *
FROM master..spt_values
WHERE low IS NULL

GO

/*Generate an execution plan*/
SET FMTONLY ON
EXEC dbo.#plan_test
SET FMTONLY OFF;

/*Retrieve the plan and parse the estimated rows*/
WITH  XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as sql) 
SELECT  query_plan.value('(//sql:StmtSimple[1]/@StatementEstRows)[1]', 'float') AS EstimatedNumberOfRows
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) 
WHERE sys.dm_exec_sql_text.objectid=OBJECT_ID('tempdb.dbo.#plan_test') 
    AND sys.dm_exec_sql_text.dbid=2

DROP PROC dbo.#plan_test

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