Почему в моем проиндексированном столбце отсутствует статистика? - PullRequest
0 голосов
/ 22 сентября 2011

Я использую SQL Server и в настоящее время пытаюсь отладить некоторые запросы, когда оптимизатор выбрал плохой план выполнения, и я заметил для одного из моих проиндексированных столбцов, что при запуске команды:

DBCC SHOW_STATISTICS ("tablename", columnname);

для этого индексированного столбца база данных возвращает:

Не удалось найти статистику «имя столбца» в системных каталогах.

Согласно этой странице: http://msdn.microsoft.com/en-us/library/ms190397.aspx

"Оптимизатор запросов создает статистику для индексов таблиц или представлений при создании индекса."

У меня также есть AUTO_CREATE_STATISTICS.

Должен ли я вручную запускать CREATE STATISTICS для этого столбца? Если это так, так как это индекс, не должен ли он уже иметь статистику для столбца?

1 Ответ

1 голос
/ 09 июня 2017

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

Если целью является имя существующего столбца и автоматически Созданная статистика по этому столбцу существует, информация об этом автоматически созданная статистика возвращается. Если автоматически создан статистика не существует для цели столбца, сообщение об ошибке 2767 вернулся.

Таким образом, указание имени индекса для цели (второй параметр) будет работать, но не будет работать, если вы используете имя столбца.

Если вы запустите это (кредит Эрланду Соммарскогу, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...