【发布时间】:2011-05-28 13:12:52
【问题描述】:
我们有一个有点复杂的 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) 上的索引
【问题讨论】:
-
经过反复试验,我们确定上例中的 GroupingTableB 已经过时了。问题仍然存在,但我们通过在每次插入该表时调用该表的“UPDATE STATISTICS”来解决它。不完全是理想的解决方案...
-
我知道这个问题已经过时了,但就其价值而言,当您在 WHERE 子句中对
GroupingTableB设置条件时,它会在逻辑上将其LEFT JOIN转换为INNER JOIN。你有3个这样的条件。如果您希望LEFT JOIN实际上充当正确的OUTER连接,则必须将这些条件移至LEFT JOIN中的ON子句。我只是说... :)
标签: sql-server sql-server-2000 statistics