2011-09-21 103 views
0

我使用SQL Server和我目前正試圖調試,其中優化選擇較差的執行計劃的一些疑問,我發現我的索引列的一個,當我運行命令:爲什麼我的索引列顯示沒有統計信息?

DBCC SHOW_STATISTICS ("tablename", columnname); 

對於此索引列,數據庫將返回:

無法在系統目錄中找到統計信息'columnname'。

根據此頁: http://msdn.microsoft.com/en-us/library/ms190397.aspx

「創建索引時,查詢優化器創建的表或視圖索引的統計信息。」

我也有AUTO_CREATE_STATISTICS。

我是否必須手動運行此列的CREATE STATISTICS?如果是這樣,因爲它是一個索引不應該已經有列的統計數據?

+0

在'選擇的任何跡象* FROM sys.stats WHERE OBJECT_ID = OBJECT_ID( '表名')'?這個索引是一個複合索引還是一個單列索引?另外索引本身在'sys.indexes'中沒有顯示爲禁用? –

+0

它顯示在sys.stats表中,索引名稱爲'IX_cl_messages_sent_time',它顯示的統計信息ID爲3,該表中的所有其他列都是0.它是日期時間類型列上的單列索引。索引在sys.indexes表中未被禁用。 –

+1

如果您嘗試'DBCC SHOW_STATISTICS(「tablename」,IX_cl_messages_sent_time);'? –

回答

1

https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-show-statistics-transact-sql

如果目標是現有列的名稱,並在此列中自動創建 存在統計,有關 自動創建的統計信息返回。如果列目標不存在自動創建的 統計信息,則返回錯誤消息2767爲 。

所以對指定目標指數的名稱(第二個參數)會的工作,但如果你使用的列名,它不會工作。

如果你運行這個(信貸厄蘭Sommarskog,http://www.sommarskog.se/query-plan-mysteries.html),你可以看到,如果統計中自動創建或不:

DECLARE @tbl NVARCHAR(256) 
SELECT @tbl = 'tableName' 

SELECT 
    o.name, s.stats_id, s.name, s.auto_created, s.user_created, 
    SUBSTRING(scols.cols, 3, LEN(scols.cols)) AS stat_cols, 
    STATS_DATE(o.object_id, s.stats_id) AS stats_date, 
    s.filter_definition 
FROM 
    sys.objects o JOIN 
    sys.stats s ON s.object_id = o.object_id 
CROSS APPLY 
(
    SELECT ', ' + c.name 
    FROM 
    sys.stats_columns sc JOIN 
    sys.columns c ON sc.object_id = c.object_id AND sc.column_id = c.column_id 
    WHERE sc.object_id = s.object_id AND sc.stats_id = s.stats_id 
    ORDER BY sc.stats_column_id 
    FOR XML PATH('') 
) AS scols(cols) 
WHERE o.name = @tbl 
ORDER BY o.name, s.stats_id 
相關問題