多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

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

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

先看看非嵌套查詢(xún)

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è)非嵌套查詢(xún),讓“and t2.b=1”和“and t3.c=1”分別在join...on和where之間游走,用Management Studio選中“包含實(shí)際的執(zhí)行計(jì)劃”并執(zhí)行這三條語(yǔ)句,都得出下面這個(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à)的。

接著看嵌套查詢(xún)

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語(yǔ)句把t2的查詢(xún)變成子查詢(xún),第二句sql語(yǔ)句把t2,t3分別變成子查詢(xún),第三句把t2和t3的查詢(xún)合成一個(gè)子查詢(xún),再看看實(shí)際的執(zhí)行計(jì)劃:

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

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

接著,在上面兩個(gè)執(zhí)行計(jì)劃的圖中又發(fā)現(xiàn)一個(gè)小問(wèn)題,為什么明明是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)起來(lái)?

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

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)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線(xiàn)----------------------------
分享到:
------分隔線(xiàn)----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 色人阁色五月 | 亚洲国产精品自在在线观看 | 国产亚洲精品久久久久久 | 婷婷丁香综合 | free欧美xxxxvideo free欧美性杂交hd | 成人无遮挡免费网站视频在线观看 | 91丨九色丨首页在线观看 | 风间由美一区二区av101 | 久久精品一区二区三区中文字幕 | 久久国产视屏 | 成年人免费观看的视频 | 久久精品亚洲99一区二区 | 欧美a在线播放 | 在线h网站| 天天综合网天天做天天受 | 国产一区二区三区免费 | 国产视频久久久 | 国产成人综合亚洲欧美在 | 在线观看wwww | 亚洲妇人成熟性成熟网站 | 视频免费视频观看网站 | 欧美亚洲国产精品久久高清 | 国产福利一区二区三区在线视频 | 欧美14videosex性欧美成人 | 伊人网五月天 | 最近的免费中文字幕视频 | 国产成人在线播放视频 | 亚洲午夜精品久久久久 | 久久国产成人精品国产成人亚洲 | 精品精品国产高清a毛片牛牛 | 午夜老司机免费视频 | 欧美久久久久久久一区二区三区 | 亚洲福利视频一区二区 | 永久在线观看视频 | 中文字幕亚洲精品 | 午夜视频在线观看免费观看在线观看 | 最近中文字幕更新免费 | 国产日韩欧美精品一区二区三区 | 国产色啪午夜免费福利视频 | 美女一级牲交毛片视频 | jizz亚洲日本jizz |