3 回答

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊
我希望第一個查詢更快,主要是因為您有一個等效項和一個顯式的JOIN。以我的經(jīng)驗,IN
運(yùn)算符非常慢,因為SQL通常將其評估為一系列WHERE
由“ OR”(WHERE x=Y OR x=Z OR...
)分隔的子句。
與ALL THINGS SQL一樣,您的里程可能會有所不同。速度很大程度上取決于索引(您是否在兩個ID列上都有索引?這將有很大幫助...)。
唯一可以百分百確定哪個更快的真實方法是打開性能跟蹤(IO Statistics特別有用)并同時運(yùn)行它們。確保在兩次運(yùn)行之間清除緩存!

TA貢獻(xiàn)1818條經(jīng)驗 獲得超3個贊
好吧,我相信這是一個“古老而又黃金”的問題。答案是:“取決于!”。表演是如此精致,以至于說:“從不使用子查詢,總是加入”,這太愚蠢了。在以下鏈接中,您會發(fā)現(xiàn)一些我發(fā)現(xiàn)非常有幫助的基本最佳實踐:
優(yōu)化子查詢
使用半聯(lián)接轉(zhuǎn)換優(yōu)化子查詢
將子查詢重寫為聯(lián)接
我有一個包含50000個元素的表,我想要的結(jié)果是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
)
執(zhí)行時間為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,好的。

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊
開始查看執(zhí)行計劃,以了解SQl Server將如何解釋它們的差異。您還可以使用Profiler實際多次運(yùn)行查詢并獲得差異。
我不希望它們有如此可怕的區(qū)別,當(dāng)您使用關(guān)聯(lián)子查詢時,使用連接而不是子查詢可以真正獲得較大的性能提升。
EXISTS通常比這兩個中的任何一個都要好,并且當(dāng)您要在左連接中要所有記錄都不在左連接表中時,使用NOT EXISTS通常是更好的選擇。
添加回答
舉報