我们有一个有点复杂的 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 包含数十行。
索引 IX_DataTableA 是 (IndexedColumn1 ASC, IndexedColumn2 ASC) 上的索引
最佳答案
如果您强制它使用特定索引(WITH (INDEX(IX_DataTableA))
你确定你比优化器更了解吗?
我将首先查看快速更新和慢速更新的执行计划。另外,快/慢查询的更新记录数量是否具有可比性?
关于sql-server - 为什么 SQL Server 中的统计信息很快就会过时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4494895/