Sql-Server

執行計劃中的錯誤估計

  • October 19, 2016

關於 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它只會妨礙性能。

請記住:視圖不是為了性能,它們是為了簡單和易於訪問資訊。

引用自:https://dba.stackexchange.com/questions/152773