Sql-Server

stats_date 為空

  • November 11, 2016

如果我在我們的系統上執行此查詢:

SELECT STATS_DATE(t.object_id, s.stats_id) AS stdate, * 
from    sys.stats s WITH (NOLOCK)
INNER JOIN sys.tables t WITH (NOLOCK) ON t.object_id = s.object_id
WHERE t.name LIKE 'mytable%'

有時會看到該stats_date函式返回 NULL。根據 BOL,這應該是不可能的,除非有錯誤。它沒有說明哪個錯誤。

這張表很大,有 110 億行。如果我執行:

UPDATE STATISTICS fct.mytable ( pk_mytable)

stats_date再次返回為非空。

為什麼日期為空,我該如何防止呢?

只有主鍵的統計資訊為 NULL。

如果我執行:

DBCC SHOW_STATISTICS ('fct.MyTable', 'IX_MyTableID') 

它返回了我期望的 3 個結果集。如果我執行:

DBCC SHOW_STATISTICS ('fct.MyTable', 'PK_MyTable') 

它返回:

在此處輸入圖像描述

根據MSDN,它可以在錯誤時返回 null,儘管我不確定為什麼您會遇到錯誤。您是否考慮過對 sys.dm_db_stats_properties 函式進行外部應用以查看是否得到相同的結果?

SELECT  t.name ,
       s.object_id ,
       s.stats_id ,
       c.name ,
       sc.stats_column_id ,
       s.name ,
       sp.last_updated ,
       sp.rows_sampled ,
       sp.modification_counter ,
       sp.steps ,
       sp.rows
FROM    [sys].[stats] AS [s]
       INNER JOIN sys.stats_columns sc ON s.stats_id = sc.stats_id
                                           AND s.object_id = sc.object_id
       INNER JOIN sys.columns c ON c.object_id = sc.object_id
                                   AND c.column_id = sc.column_id
       INNER JOIN sys.tables t ON c.object_id = t.object_id
       OUTER APPLY sys.dm_db_stats_properties([s].[object_id],
                                               [s].[stats_id]) AS [sp]
WHERE   t.name LIKE 'mytable%';

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