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