sql-server - 为什么 SQL Server 中的统计信息很快就会过时?

标签 sql-server sql-server-2000 statistics

我们有一个有点复杂的 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/

相关文章:

sql-server - 使用 Entity Framework 代码优先创建存储过程?

sql-server - 可以更改 SQL Server 2000 View 中的列长度吗?

sql - 如何找出哪些数据不会转换?

sql-server-2000 - SQL SPID 阻塞本身

algorithm - 生成随机列联表的有效方法?

sql-server - 主键和外键同时存在

sql-server - 每个 N 的最新记录的最佳执行查询

python - 使用 scipy 和 groupby 计算 Kendall 的 tau

sql - 停止触发器更改scope_identity

python - 使用 CURVE_FIT 在 Python 中拟合对数正态分布