成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對比SQL中簡單嵌套查詢與非嵌套查詢的異同

數(shù)據(jù)庫 SQL Server 數(shù)據(jù)庫運維
在這里我們將討論的是SQL中簡單嵌套查詢與非嵌套查詢的異同,希望對大家有所幫助。

本文將討論的是SQL中簡單嵌套查詢與非嵌套查詢的異同,通過這些來更加深刻理解SQL語句。

某天的工作是修復(fù)某個項目的bug,接著就發(fā)現(xiàn),其sql極其混亂,有非常多的left join和in操作,還有嵌套查詢(只有一個表的嵌套查詢)。不知道看到過哪里的資料說,嵌套查詢速度慢,于是我把全部嵌套查詢都改成join的形式,嵌套查詢里面的where條件,我都寫到j(luò)oin...on后面去了。突然一個想法冒出來:篩選條件跟在join...on后面 和 跟在整個sql語句***面的where后面有什么區(qū)別呢?還有嵌套查詢真的慢么?于是便有下面的測試產(chǎn)生,數(shù)據(jù)庫環(huán)境為MS SQL 2005。

一,inner join

先看看非嵌套查詢:

  1. a.select * from t1  
  2. inner join t2 on t1.id = t2.id  
  3. inner join t3 on t1.id = t3.id  
  4. where t1.a=1 and t2.b=1 and t3.c=1  
  5.  
  6. b.select * from t1  
  7. inner join t2 on t1.id = t2.id and t2.b=1   
  8. inner join t3 on t1.id = t3.id  
  9. where t1.a=1 and t3.c=1  
  10.  
  11. c.select * from t1  
  12. inner join t2 on t1.id = t2.id and t2.b=1   
  13. inner join t3 on t1.id = t3.id and t3.c=1  
  14. where t1.a=1 

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

執(zhí)行計劃

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

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后面是等價的。

接著看嵌套查詢

  1. d.select * from t1  
  2. inner join (select * from t2 where t2.b=1)a on t1.id=a.id  
  3. inner join t3 on t1.id = t3.id  
  4. where t1.a=1 and t3.c=1  
  5.  
  6. e.select * from t1  
  7. inner join (select * from t2 where t2.b=1)a on t1.id=a.id  
  8. inner join (select * from t3 where t3.c=1)b on t1.id=b.id  
  9. where t1.a=1  
  10.  
  11. f.elect * from t1  
  12. 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  
  13. where t1.a=1 

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

執(zhí)行計劃

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

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

 

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

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

(感謝Keep Walking的補充:

“可以指定順序,force order選項,和keep plan選項

 

數(shù)量級,索引,統(tǒng)計的不同都可以導(dǎo)致順序變化”。
我Google了一下option force order和option keep plan,發(fā)現(xiàn)SQL優(yōu)化器做了很多事情,在這文章就不列出來了,大家有興趣可以Goo一下。)

 

PS:

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

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

原文標(biāo)題:SQL語句分析:ON與WHERE的比較_簡單嵌套查詢與非嵌套查詢的比較

鏈接:http://www.cnblogs.com/StephenHuang/archive/2010/01/03/1637846.html

【編輯推薦】

  1. SQL Server通過代碼執(zhí)行代理任務(wù)
  2. SQL Server即將提升實時數(shù)據(jù)功能
  3. SQL Server置疑數(shù)據(jù)庫解決方法
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2010-09-26 09:05:48

SQL嵌套子查詢

2010-07-08 15:40:28

SQL Server嵌

2010-06-29 17:52:02

SQL Server嵌

2009-09-14 18:23:59

LINQ嵌套查詢

2010-06-30 08:41:21

SQL Server嵌

2011-03-04 13:07:06

SQL Server數(shù)

2011-04-01 14:34:31

SQL Server數(shù)嵌套子查詢

2010-11-11 11:49:02

SQL嵌套SELECT

2010-10-21 10:28:13

SQL Server查

2010-11-25 11:31:52

MySQL查詢

2010-09-08 16:48:27

SQL循環(huán)游標(biāo)

2010-09-03 14:39:15

SQLSELECT語句

2010-11-09 10:00:37

SQL Server簡

2022-06-20 07:32:17

ES映射搜索

2010-10-27 13:35:15

Oracle查詢

2023-12-13 12:41:59

原生CSS元素

2012-06-02 00:45:36

JPA查詢語言JPQL

2023-08-29 09:46:12

SQLCTE遞歸

2013-12-03 10:20:35

開源SQL查詢系統(tǒng)

2010-10-27 13:39:34

Oracle查詢
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久毛片网站 | 色婷婷av一区二区三区软件 | 色999视频 | 亚洲欧美一区二区三区情侣bbw | 激情欧美一区二区三区中文字幕 | 欧美精品一区二区三区蜜桃视频 | 免费在线观看一区二区三区 | 久久看片 | 久久草在线视频 | wwww.8888久久爱站网 | 日韩精品免费一区二区在线观看 | 国产精品入口久久 | 欧美极品在线观看 | 亚洲国产午夜 | www国产亚洲精品久久网站 | a免费在线 | 成人av网站在线观看 | 精品国产不卡一区二区三区 | 国产乱人伦精品一区二区 | 日本在线视频不卡 | 亚洲国产精品91 | 日韩一区二 | 欧美日韩最新 | 一区二区久久 | 7777奇米影视 | 蜜桃av鲁一鲁一鲁一鲁 | 99久热 | 中文字幕一区二区三区精彩视频 | 国产精品视频区 | 日韩一二区 | 亚洲一区二区视频 | 午夜国产 | 青青草中文字幕 | 免费黄色成人 | 久久99深爱久久99精品 | 一级电影免费看 | a级在线观看 | 午夜网 | 天天操夜夜操免费视频 | 国产成人精品一区二区 | 日韩亚洲一区二区 |