Почему статистика так быстро устаревает в SQL Server? - PullRequest
6 голосов
/ 21 декабря 2010

У нас есть довольно сложный запрос на обновление SQL, который запускается несколько раз в месяц. В большинстве случаев кажется, что он работает очень быстро, но в некоторых базах данных это занимает очень много времени. После запуска «UPDATE STATISTICS» для соответствующих таблиц обновление сразу же снова запускается быстро. Наконец, мы создали ночную задачу, которая вызывает UPDATE STATISTICS для всех таблиц в базе данных. Но это, похоже, не решило проблему. Нам по-прежнему приходится каждый раз запускать «ОБНОВЛЕНИЕ СТАТИСТИКИ» вручную. Почему статистика так быстро устареет?

Примерно так выглядит запрос:

UPDATE DataTableA
SET DataTableA.IndexedColumn1 = 123456789, DataTableA.Flag1 = 1
FROM DataTableA WITH (INDEX(IX_DataTableA))
INNER JOIN GroupingTableA ON GroupingTableA.ForeignKey1 = GroupingTableA.PrimaryKey
INNER JOIN LookupTableA ON DataTableA.ForeignKey3 = LookupTableA.PrimaryKey
LEFT OUTER JOIN GroupingTableB ON DataTableA.IndexedColumn2 = GroupingTableB.IndexedColumn2
WHERE GroupingTableB.IndexedColumn1 = 123456789
AND DataTableA.IndexedColumn1 IS NULL
AND DataTableA.IndexedColumn2 IN ( ... 300 entries here ... )
AND DataTableA.Deleted = 0
AND GroupingTableA.Date <= GroupingTableB.EndDate
AND GroupingTableA.Date >= DATEADD(month, -1, GroupingTableB.StartDate)
AND LookupTableA.Column2 = 1
AND DataTableA.Status1 IN (1, 3)
AND DataTableA.Status2 NOT IN (1, 3, 9)

DataTableA содержит миллионы строк.
GroupingTableA и GroupingTableB содержат десятки тысяч строк.
LookupTableA содержит десятки строк.
Index IX_DataTableA - это индекс для (IndexedColumn1 ASC, IndexedColumn2 ASC)

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

Не думаю, что ваша статистика будет так же важна, если вы заставите ее использовать определенный индекс (WITH (INDEX(IX_DataTableA))

Вы уверены, что знаете лучше, чем оптимизатор?

Я бы начал с просмотра плана выполнения для быстрого и медленного обновления. Кроме того, сопоставимо ли количество обновляемых записей для быстрых / медленных запросов?

1 голос
/ 21 декабря 2010

Когда автоматическая статистика включена, движок хотел бы обновлять статистику довольно часто , обычно намного чаще, чем за ночь:

 Table Type | Empty Condition | Threshold When Empty |Threshold When Not Empty 
_________________________________________________________________________________
 Permanent  | < 500 rows      | # of Changes >= 500  | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
 Temporary  | < 6 rows        | # of Changes >= 6    | # of Changes >= 500 + (20% of Cardinality)

Но почему бы не исключить предположениеи просто развернуть план руководства?См. Основные сведения о планах .

...