我們有一個比較複雜的SQL更新查詢,每月運行幾次。大多數情況下,它似乎運行速度非常快,但在某些數據庫中,這需要很長時間。在涉及的表上運行「UPDATE STATISTICS」之後,更新立即再次快速運行。我們最終設置了一個夜間任務,在數據庫中的所有表上調用UPDATE STATISTICS。但是這似乎並沒有解決問題。我們仍然不得不每次手動運行「UPDATE STATISTICS」。爲什麼統計數據會這麼快就過時了?爲什麼統計信息在SQL Server中如此快速過時?
這裏的大約查詢的樣子:
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」來解決這個問題。不完全是理想的解決方案... – 2011-06-28 15:15:07
我知道這個問題很陳舊,但是對於它的價值,在WHERE子句中將條件放在GroupingTableB上的那一刻,它將其「LEFT JOIN」邏輯地轉換爲「INNER JOIN '。你有3個這樣的條件。如果你想讓'LEFT JOIN'實際上作爲一個適當的'OUTER'連接,那麼這些條件必須移動到'LEFT JOIN'中的'ON'子句。我只是在說'... :) – ErikE 2013-01-12 03:31:42