Sql-Server

哪種方式是執行特定選擇查詢的最有效方式?

  • March 10, 2016

如果我執行以下程式碼:

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 的嵌套循環。

至於什麼看起來更好,更易於維護,我認為它們都是相對可行的。只是一些想法和替代方案的圖形表示。

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