日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 數(shù)據(jù)庫 > Sqlserver > SQL語句簡(jiǎn)單嵌套查詢與非嵌套查詢的比較

SQL語句簡(jiǎn)單嵌套查詢與非嵌套查詢的比較

來源:程序員人生   發(fā)布時(shí)間:2014-01-08 20:34:32 閱讀次數(shù):2815次
某天的工作是修復(fù)某個(gè)項(xiàng)目的bug,接著就發(fā)現(xiàn),其sql極其混亂,有非常多的left join和in操作,還有嵌套查詢(只有一個(gè)表的嵌套查詢)。不知道看到過哪里的資料說,嵌套查詢速度慢,于是我把全部嵌套查詢都改成join的形式,嵌套查詢里面的where條件,我都寫到j(luò)oin...on后面去了。突然一個(gè)想法冒出來:篩選條件跟在join...on后面(下面join均指inner join,其他join沒有實(shí)際進(jìn)行測(cè)試) 和 跟在整個(gè)sql語句最后面的where后面有什么區(qū)別呢?還有嵌套查詢真的慢么?于是便有下面的測(cè)試產(chǎn)生,數(shù)據(jù)庫環(huán)境為MS SQL 2005

先看看非嵌套查詢

a.select * from t1
inner join t2 on t1.id = t2.id
inner join t3 on t1.id = t3.id
where t1.a=1 and t2.b=1 and t3.c=1

b.select * from t1
inner join t2 on t1.id = t2.id and t2.b=1
inner join t3 on t1.id = t3.id
where t1.a=1 and t3.c=1

c.select * from t1
inner join t2 on t1.id = t2.id and t2.b=1
inner join t3 on t1.id = t3.id and t3.c=1
where t1.a=1

在上面三個(gè)非嵌套查詢,讓“and t2.b=1”和“and t3.c=1”分別在join...on和where之間游走,用Management Studio選中“包含實(shí)際的執(zhí)行計(jì)劃”并執(zhí)行這三條語句,都得出下面這個(gè)執(zhí)行計(jì)劃。

三個(gè)“聚集索引掃描”的謂詞從上到下分別是:

1.t3.c=1

2.t1.a=1 (seek謂詞:t1.id=t3.id)

3.t2.b=1 (seek謂詞:t2.id=t3.id)

故可以認(rèn)為:在MS SQL2005中,條件跟在join...on后面 和 跟在where后面是等價(jià)的。

接著看嵌套查詢

d.select * from t1
inner join (select * from t2 where t2.b=1)a on t1.id=a.id
inner join t3 on t1.id = t3.id
where t1.a=1 and t3.c=1

e.select * from t1
inner join (select * from t2 where t2.b=1)a on t1.id=a.id
inner join (select * from t3 where t3.c=1)b on t1.id=b.id
where t1.a=1

f.elect * from t1
inner join (select t3.id,t2.b,t3.c from t3 inner join t2 on t2.id = t3.id where t2.b=1 and t3.c=1)a on t1.id=a.id
where t1.a=1

第一句sql語句把t2的查詢變成子查詢,第二句sql語句把t2,t3分別變成子查詢,第三句把t2和t3的查詢合成一個(gè)子查詢,再看看實(shí)際的執(zhí)行計(jì)劃:

跟上面非嵌套查詢的執(zhí)行計(jì)劃一模一樣。

故可以認(rèn)為:簡(jiǎn)單(注意是簡(jiǎn)單的,復(fù)雜的情況得另外考慮)嵌套查詢和其相對(duì)應(yīng)的非嵌套查詢形式,執(zhí)行效率是一樣的(網(wǎng)上一些文章指出這是MS SQL優(yōu)化器針對(duì)這些嵌套查詢進(jìn)行了優(yōu)化)。

接著,在上面兩個(gè)執(zhí)行計(jì)劃的圖中又發(fā)現(xiàn)一個(gè)小問題,為什么明明是select t1 inner join t2 inner join t3,執(zhí)行計(jì)劃卻把t1和t3先inner join(t1.id = t3.id)再跟t2 inner join(t2.id = t3.id)起來?

經(jīng)過三個(gè)表,四個(gè)表,五個(gè)表進(jìn)行連接測(cè)試,發(fā)現(xiàn)這些順序都是不確定的。很可能這些順序是根據(jù)SQL優(yōu)化器內(nèi)的算法所決定的,由于沒有源代碼,所以無從考究。

PS:

1.經(jīng)測(cè)試,在join on后面t1.id = t2.id與t2.id = t1.id等價(jià)

如果發(fā)現(xiàn)這文章有錯(cuò)誤,歡迎指出。

作者博客:http://www.cnblogs.com/StephenHuang/

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: www.欧美 | 欧美日韩不卡 | 操出白浆视频 | japanese久久 | 一级特黄录像免费播放全99 | 久久久久久精 | 亚洲欧美一区二 | 久久精品视频一区二区三区 | a在线观看视频 | 国产羞羞视频在线观看 | 国产美女久久 | 免费av在线播放 | 成年人在线观看 | 天天干天天爽 | 视频在线观看国产 | 黄a在线 | 亚洲成人一区二区三区 | 精品国产免费久久久久久尖叫 | 精品久久久久久久人人人人传媒 | 久久久久久一区二区三区四区别墅 | 99国产精品视频免费观看 | 激情综合视频 | 91精品国产91综合久久蜜臀 | 成人亚洲视频 | 国产激情在线 | 精品视频亚洲 | 国产精品18久久久久久久网站 | 亚洲天堂网站 | 成人韩免费网站 | 日韩一区二区三区精品 | 性欧美18 | 欧美成年网站 | 精品亚洲一区二区三区 | 欧美性天天影院 | 久久国产精品久久久久久久久久 | 国产精品一区二区三区在线 | 五月婷婷亚洲 | 久久宅男| 叶山小百合av一区二区 | 中文日产幕无线码一二三四区 | 欧美日韩精品一区二区三区 |