Sql-Server
哪種方式是執行特定選擇查詢的最有效方式?
如果我執行以下程式碼:
select PolicyNumber, MAX(decpageid) as decpageid, Risk from StatRiskDecpages where PolicyNumber = 'AR-0000301132-04' group by PolicyNumber, Risk
我得到以下結果:
PolicyNumber decpageid Risk AR-0000301132-04 41 1 AR-0000301132-04 41 2 AR-0000301132-04 37 3
我真正想要檢索的只是 policynumber 和最大 decpageid(在本例中為 41)以及風險編號(應該是 1 和 2)
該查詢也返回 decpageid 37,即使它不是 policynumber 的最大 decpageid,因為它具有不同的風險。
我想要返回的結果是:
PolicyNumber DecpageID Risk AR-0000301132-04 41 1 AR-0000301132-04 41 2
我已經找到了 2 個不同的查詢,可以用來返回我想要的結果,但我認為它們不是最有效的。我提出的查詢是:
select PolicyNumber, MAX(decpageid) as decpageid, Risk from StatRiskDecpages where PolicyNumber = 'AR-0000301132-04' and decpageid = ( select MAX(decpageid) from StatRiskDecpages where PolicyNumber = 'AR-0000301132-04' ) ;
這將返回所需的結果,但我不想在查詢中多次指定策略編號。有沒有辦法從外部查詢中將 policynumber 呼叫到子查詢中?
我提出的另一個問題是:
select t1.PolicyNumber,t2.DecpageID, t2.Risk from ( select PolicyNumber, MAX(decpageid) as decpageid from StatRiskDecpages where PolicyNumber = 'AR-0000301132-04' group by PolicyNumber ) as t1 left join StatRiskDecpages as t2 on t1.PolicyNumber = t2.PolicyNumber and t1.decpageid = t2.DecpageID ;
我喜歡這個查詢,因為我只需要指定 policynumber 1 次,而且我還可以擴展查詢,這樣我就可以返回多個 policynumber 的資訊。
我需要知道的是這是否是編寫查詢的最有效方式?似乎有點多餘。我可能錯了,但我認為可能有更好更有效的方式來編寫查詢。有什麼建議?
我可能會用
SELECT TOP (1) WITH TIES PolicyNumber, decpageid, Risk FROM StatRiskDecpages WHERE PolicyNumber = 'AR-0000301132-04' ORDER BY decpageid DESC
假設這上面的覆蓋指數
(PolicyNumber, decpageid) INCLUDE(Risk)
會給你一個像這樣的計劃
這是我重構您的查詢的方式。(首先我會將您的查詢與您的執行計劃一起發布,然後是我的新查詢和相應的查詢計劃)
您的查詢
Select t1.PolicyNumber, t2.DecpageID, t2.Risk from ( select PolicyNumber, MAX(decpageid) as decpageid from StatRiskDecpages where PolicyNumber = 'AR-0000301132-04' group by PolicyNumber ) as t1 left join StatRiskDecpages as t2 on t1.PolicyNumber = t2.PolicyNumber and t1.decpageid = t2.DecpageID
您的查詢的執行計劃如下:
然後我寫了這樣的查詢,給出了相同的預期結果:
我的查詢
select p.PolicyNumber, p.decpageid, p.Risk from StatRiskDecpages p where decpageid in ( select max(decpageid) from StatRiskDecpages where PolicyNumber = p.PolicyNumber )
這顯示了一個執行計劃:
請注意單個表掃描(與您的兩個表掃描相反),以及缺少用於 JOIN 的嵌套循環。
至於什麼看起來更好,更易於維護,我認為它們都是相對可行的。只是一些想法和替代方案的圖形表示。