Sql-Server
執行計劃中的錯誤估計
關於 SQL Server 2012 (11.0.2218) 中的基數估計,我有一個奇怪的問題。
所有統計資訊都使用 sp_updatestats 更新,但一些運算符僅顯示 1 個估計行,即使執行後的實際行數要高得多。查詢表現不佳(大約 1 分鐘)。
你能向我解釋一下我需要改變什麼來改進這些估計嗎?或者它是 SQL Server 引擎中的錯誤?
這是查詢的實際計劃。
我看到你在玩加入提示。這些是任何人在查詢優化時都應該做的最後手段。
MERGE
關鍵字強制對邏輯操作進行物理INNER JOIN
操作。我建議在PlanExplorer完全免費的工具中執行查詢(不需要聯繫資訊)並查看獲取統計資訊的索引分析。SELECT s.StudentID , s.LastName , s.FirstName , s.MiddleName , s.PassportSeries , s.PassportNumber , s.PassportIssued , s.PassportDate , ssp.DepartmentID , bd.BookerId AS [DepartmentUuid] FROM dbo.StudentDetailsView sdv JOIN Students s ON s.StudentID = sdv.StudentID JOIN StudentSpecialities ssp ON ssp.ID = sdv.StudentSpecialityID JOIN Booker_Departments bd ON bd.UniversityId = ssp.DepartmentID JOIN StudentFoundations sf ON sf.ID = sdv.StudentFoundationID LEFT JOIN StudentStates ss ON ss.ID = sdv.StudentStateID INNER MERGE JOIN StudentSettlements sse ON sse.StudentID = sdv.StudentID WHERE ss.ID IS NULL AND ( ssp.EndDate IS NULL OR ssp.EndDate >= GETDATE() ) AND ( sf.EndDate IS NULL OR sf.EndDate >= GETDATE() ) AND ( sf.FoundationID = 7 OR sf.FoundationID = 10 )
查看您的查詢和執行計劃,我注意到以下過濾器
[dbo].[Students].[StudentID] = [dbo].[Students].[StudentID]
這沒有任何意義,因為它是自連接回表的。在仔細查看您的計劃後,我意識到您正在從視圖中取回數據,然後將其連接回視圖中存在的基表。一個已知問題是,無論您更新多少統計資訊,嵌套視圖都會生成估計的行數 1。我的建議是重寫查詢而不使用
StudentDetailsView
它只會妨礙性能。請記住:視圖不是為了性能,它們是為了簡單和易於訪問資訊。