为什么我的索引列似乎没有统计信息?

时间:2011-09-21 23:06:58

标签: sql-server-2008 statistics

我正在使用SQL Server,我正在尝试调试一些优化器选择了糟糕的执行计划的查询,我注意到我的一个索引列,当我运行命令时:

DBCC SHOW_STATISTICS ("tablename", columnname);

对于此索引列,数据库返回:

无法在系统目录中找到统计信息“columnname”。

根据此页面: http://msdn.microsoft.com/en-us/library/ms190397.aspx

“查询优化器在创建索引时为表或视图上的索引创建统计信息。”

我也有AUTO_CREATE_STATISTICS。

我是否必须手动为此列运行CREATE STATISTICS?如果是这样,因为它是一个索引,它不应该已经有列的统计数据吗?

1 个答案:

答案 0 :(得分:1)

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

  

如果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