亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL連接與SQL子查詢(性能)?

SQL連接與SQL子查詢(性能)?

繁星淼淼 2019-10-25 10:26:54
我想知道我是否有類似這樣的聯接查詢-Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id和一個類似這樣的子查詢 -Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept)當我考慮性能時,兩個查詢中哪個查詢會更快,為什么?還有一段時間我應該優先選擇另一個嗎?抱歉,這太瑣碎了,之前問過,但是對此我感到困惑。另外,如果你們能建議我一些我可以用來衡量兩個查詢性能的工具,那將是很棒的。非常感謝!
查看完整描述

3 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

我希望第一個查詢更快,主要是因為您有一個等效項和一個顯式的JOIN。以我的經驗,IN運算符非常慢,因為SQL通常將其評估為一系列WHERE由“ OR”(WHERE x=Y OR x=Z OR...)分隔的子句。

與ALL THINGS SQL一樣,您的里程可能會有所不同。速度很大程度上取決于索引(您是否在兩個ID列上都有索引?這將有很大幫助...)。

唯一可以百分百確定哪個更快的真實方法是打開性能跟蹤(IO Statistics特別有用)并同時運行它們。確保在兩次運行之間清除緩存!


查看完整回答
反對 回復 2019-10-25
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

好吧,我相信這是一個“古老而又黃金”的問題。答案是:“取決于!”。表演是如此精致,以至于說:“從不使用子查詢,總是加入”,這太愚蠢了。在以下鏈接中,您會發現一些我發現非常有幫助的基本最佳實踐:


優化子查詢

使用半聯接轉換優化子查詢

將子查詢重寫為聯接

我有一個包含50000個元素的表,我想要的結果是739個元素。


我最初的查詢是這樣的:


SELECT  p.id,

    p.fixedId,

    p.azienda_id,

    p.categoria_id,

    p.linea,

    p.tipo,

    p.nome

FROM prodotto p

WHERE p.azienda_id = 2699 AND p.anno = (

    SELECT MAX(p2.anno) 

    FROM prodotto p2 

    WHERE p2.fixedId = p.fixedId 

)

執行時間為7.9秒。


我的查詢最后是這樣的:


SELECT  p.id,

    p.fixedId,

    p.azienda_id,

    p.categoria_id,

    p.linea,

    p.tipo,

    p.nome

FROM prodotto p

WHERE p.azienda_id = 2699 AND (p.fixedId, p.anno) IN

(

    SELECT p2.fixedId, MAX(p2.anno)

    FROM prodotto p2

    WHERE p.azienda_id = p2.azienda_id

    GROUP BY p2.fixedId

)

花了0.0256秒


好的SQL,好的。


查看完整回答
反對 回復 2019-10-25
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

開始查看執行計劃,以了解SQl Server將如何解釋它們的差異。您還可以使用Profiler實際多次運行查詢并獲得差異。


我不希望它們有如此可怕的區別,當您使用關聯子查詢時,使用連接而不是子查詢可以真正獲得較大的性能提升。


EXISTS通常比這兩個中的任何一個都要好,并且當您要在左連接中要所有記錄都不在左連接表中時,使用NOT EXISTS通常是更好的選擇。


查看完整回答
反對 回復 2019-10-25
  • 3 回答
  • 0 關注
  • 1617 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號