我是新來的性能問題。所以我不確定我的方法應該是什麼。如何提高哈希匹配的外部連接的SQL Server性能問題
這是超過7分鐘運行的查詢。
INSERT INTO SubscriberToEncounterMapping(PatientEncounterID, InsuranceSubscriberID)
SELECT
PV.PatientVisitId AS PatientEncounterID,
InsSub.InsuranceSubscriberID
FROM
DB1.dbo.PatientVisit PV
JOIN
DB1.dbo.PatientVisitInsurance PVI ON PV.PatientVisitId = PVI.PatientVisitId
JOIN
DB1.dbo.PatientInsurance PatIns on PatIns.PatientInsuranceId = PVI.PatientInsuranceId
JOIN
DB1.dbo.PatientProfile PP On PP.PatientProfileId = PatIns.PatientProfileId
LEFT OUTER JOIN
DB1.dbo.Guarantor G ON PatIns.PatientProfileId = G.PatientProfileId
JOIN
Warehouse.dbo.InsuranceSubscriber InsSub ON InsSub.InsuranceCarriersID = PatIns.InsuranceCarriersId
AND InsSub.OrderForClaims = PatIns.OrderForClaims
AND ((InsSub.GuarantorID = G.GuarantorId) OR (InsSub.GuarantorID IS NULL AND G.GuarantorId IS NULL))
JOIN
Warehouse.dbo.Encounter E ON E.PatientEncounterID = PV.PatientVisitId
執行計劃指出,有一個
查詢哈希匹配右外連接,成本89%
。
沒有一個右外連接查詢,所以我不明白問題出在哪裏。
如何使查詢更有效?
首先:我沒有看到你的語句使用您在.....也行的你'SELECT'列表使用'InsSub'別名任何表:你*真的*需要加入所有這些表格才能得到這兩條信息? –
你可以顯示哈希匹配的細節嗎?什麼是探測器,輸出是什麼?從屏幕截圖中不清楚。我猜想這個謂詞會導致你的問題 - '(InsSub.GuarantorID = G.GuarantorId)或(InsSub.GuarantorID IS NULL AND G.GuarantorId IS NULL)',你可能想要考慮使用兩個查詢,並且結合結果通常當你有這樣的OR或謂詞時,它會導致次優計劃,而且這兩個單獨的查詢能夠更好地利用索引。 – GarethD
@GarethD也許在where子句中使用EXISTS而不是在連接中使用這兩個謂詞? – dfundako