我正在使用SQL Server,我正在尝试调试一些优化器选择了糟糕的执行计划的查询,我注意到我的一个索引列,当我运行命令时:
DBCC SHOW_STATISTICS ("tablename", columnname);
对于此索引列,数据库返回:
无法在系统目录中找到统计信息“columnname”。
根据此页面: http://msdn.microsoft.com/en-us/library/ms190397.aspx
“查询优化器在创建索引时为表或视图上的索引创建统计信息。”
我也有AUTO_CREATE_STATISTICS。
我是否必须手动为此列运行CREATE STATISTICS?如果是这样,因为它是一个索引,它不应该已经有列的统计数据吗?
答案 0 :(得分:1)
如果target是现有列的名称,则自动生成 已创建此列的统计信息,有关该信息的信息 返回自动创建的统计信息。如果是自动创建的 列目标不存在统计信息,错误消息2767是 返回。
因此,指定target的索引名称(第二个参数)将起作用,但如果使用列名则它将不起作用。
如果你运行这个(信用给Erland 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