Почему статистика в SQL Server так быстро устаревает?

у нас есть несколько сложный запрос на обновление 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)

6
задан Abe Miessler 20 December 2010 в 23:24
поделиться