2010-10-08 45 views
1

我有兩個不同的查詢產生相同的結果。我想知道哪一個更有效率。第二個,我用的是選擇子句少,但是我移動,其中到outter選擇。哪一個先執行? 左加入其中子句?通過左連接和分區使用分析

使用3 「選擇」:

select * from 
(
    select * from 
    (
    select 
     max(t.PRICE_DATETIME) over (partition by t.PRODUCT_ID) as LATEST_SNAPSHOT, 
     t.* 
    from 
     PRICE_TABLE t 
) a 
    where 
    a.PRICE_DATETIME = a.LATEST_SNAPSHOT; 
) r 
left join 
    PRODUCT_TABLE l on (r.PRODUCT_ID = l.PRODUCT_ID and r.PRICE_DATETIME = l.PRICE_DATETIME) 

使用2種選擇:

select * from 
(
    select 
    max(t.PRICE_DATETIME) over (partition by t.PRODUCT_ID) as LATEST_SNAPSHOT, 
    t.* 
    from 
    PRICE_TABLE t 
) r 
left join 
    PRODUCT_TABLE l on (r.PRODUCT_ID = l.PRODUCT_ID and r.PRICE_DATETIME = l.PRICE_DATETIME) 
where 
    r.PRICE_DATETIME = r.LATEST_SNAPSHOT; 

PS:我知道,我知道, 「選擇星」 是邪惡的,但我在寫這本只有這樣才能讓它變小。

+0

SQL Server可能會將兩者都編譯爲完全相同的查詢計劃 – Andomar 2010-10-08 21:22:55

回答

1

「我不知道哪一個是比較有效」

您可以通過打開的統計數據很容易地回答自己這個問題。

set statistics io on 
set statistics time on 

-- query goes here 

set statistics io off 
set statistics time off 

對您的兩個查詢中的每一個都進行此操作並比較結果。您將獲得一些有用的輸出,包括SQL Server正在執行多少次讀取,每次完成需要多少毫秒等。

您還可以看到SQL Server生成的查看執行計劃的執行計劃(ctrl + L或右鍵單擊並選擇該選項)或啓用「顯示實際執行計劃」(ctrl + M)並運行查詢。這可能有助於回答有關執行順序的問題;我無法告訴你我的頭頂。

+0

看看這些查詢,我敢打賭他們有相同的執行計劃。這將是全面掃描,窗口排序,篩選,左連接。 – 2010-10-11 15:57:56

+0

是的,我做到了。兩者的執行計劃完全相同。多謝你們。 – 2010-10-11 23:19:58