国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

多表關(guān)聯(lián)查詢過濾條件寫在On與Where后的區(qū)別

運(yùn)維 數(shù)據(jù)庫運(yùn)維
SQL優(yōu)化過程中,發(fā)現(xiàn)開發(fā)人員在寫多表關(guān)聯(lián)查詢的時(shí)候,對(duì)于謂詞過濾條件的寫法很隨意,寫在on后面與where后面的情況均有,這可能會(huì)導(dǎo)致沒有理解清楚其真正的含義而無法得到期望的結(jié)果。

[[421307]]

本文轉(zhuǎn)載自微信公眾號(hào)「數(shù)據(jù)和云」,作者于志軍 。轉(zhuǎn)載本文請(qǐng)聯(lián)系數(shù)據(jù)和云公眾號(hào)。

SQL優(yōu)化過程中,發(fā)現(xiàn)開發(fā)人員在寫多表關(guān)聯(lián)查詢的時(shí)候,對(duì)于謂詞過濾條件的寫法很隨意,寫在on后面與where后面的情況均有,這可能會(huì)導(dǎo)致沒有理解清楚其真正的含義而無法得到期望的結(jié)果。

多表關(guān)聯(lián)連接方式有inner join、left join、right join、full join四種,下面通過實(shí)驗(yàn)來說明不同連接方式謂詞放在on與where后的效果與影響。

初始化測(cè)試數(shù)據(jù)

  1. create table t1(id number(10),name varchar2(30),status varchar2(2)); 
  2. create table t2(id number(10),mobile varchar2(30)); 
  3. insert into t1 values(1,'a','1'); 
  4. insert into t1 values(2,'b','1'); 
  5. insert into t1 values(3,'c','1'); 
  6. insert into t1 values(4,'d','1'); 
  7. insert into t1 values(5,'e','1'); 
  8. insert into t1 values(6,'f','0'); 
  9. insert into t1 values(7,'g','0'); 
  10. insert into t1 values(8,'h','0'); 
  11. insert into t1 values(9,'i','0'); 
  12. insert into t1 values(10,'j','0'); 
  13. insert into t2 values(1,'12345'); 
  14. insert into t2 values(2,'23456'); 
  15. insert into t2 values(3,'34567'); 
  16. insert into t2 values(6,'67890'); 
  17. insert into t2 values(7,'78901'); 

1.Inner join

SQL>select * from t1 inner join t2 on t1.id=t2.id and t1.status=‘1’;

  1. ID NAME                           ST         ID MOBILE 
  2.     1 a                              1           1 12345 
  3.     2 b                              1           2 23456 
  4.     3 c                              1           3 34567 

SQL> select * from t1 inner join t2 on t1.id=t2.id where t1.status=‘1’;

  1. ID NAME                           ST         ID MOBILE 
  2.      1 a                              1           1 12345 
  3.      2 b                              1           2 23456 
  4.      3 c                              1           3 34567 

我們發(fā)現(xiàn)謂詞t1.status=’1’放在on后與where后結(jié)果一樣,它們的執(zhí)行計(jì)劃相同,說明CBO對(duì)這兩種情況做了相同處理。

執(zhí)行計(jì)劃如下圖所示:

Inner join時(shí)謂詞不管放在哪個(gè)位置,CBO都先對(duì)t1表過濾,再與t2表關(guān)聯(lián)。

2.left join

(1)左右表謂詞過濾都放在on后面:

SQL> select * from t1 left join t2 on t1.id=t2.id and t1.status=‘1’ and t2.id<3;

  1. ID NAME                           ST         ID MOBILE 
  2.     1 a                              1           1 12345  
  3.     2 b                              1           2 23456 
  4.     3 c                              1 
  5.     8 h                              0 
  6.     5 e                              1 
  7.     9 i                              0 
  8.    10 j                              0 
  9.     7 g                              0 
  10.     6 f                              0 
  11.     4 d                              1 

執(zhí)行計(jì)劃如下:

從執(zhí)行計(jì)劃可以看出,t1.status=’1’放在on后面,t1表并沒有對(duì)謂詞status進(jìn)行過濾,結(jié)果集顯示t1的全表數(shù)據(jù)。這是由left join的特性決定的,左表會(huì)顯示全部數(shù)據(jù)。t2.id<3是先對(duì)t2表進(jìn)行過濾再進(jìn)行連接,而t1.status=’1’是作為連接條件存在,對(duì)連接時(shí)產(chǎn)生的笛卡爾積數(shù)據(jù)做連接過濾。

(2)左右表謂詞過濾都放在where后面:

SQL>select * from t1 left join t2 on t1.id=t2.id where t1.status=‘1’ and t2.id<3;

  1. ID NAME                           ST         ID MOBILE 
  2.      1 a                              1           1 12345 
  3.      2 b                              1           2 23456 

從執(zhí)行計(jì)劃可以看出,謂詞放在where后面,是先對(duì)表進(jìn)行過濾,然后再對(duì)過濾后的數(shù)據(jù)進(jìn)行連接。而且我們發(fā)現(xiàn)t1表上自動(dòng)加上了id<3的過濾條件,這是因?yàn)橛衪1.id=t2.id等值連接,如果t1表上id列有索引,性能就能看出差別來了。注意連接方式變成了hash join,這是因?yàn)橛冶淼闹^詞過濾條件寫在where后面,CBO會(huì)把左連接等價(jià)為內(nèi)連接。

(3)右表的謂詞寫在on后面,左表的謂詞寫在where后面:

SQL>select * from t1 left join t2 on t1.id=t2.id and t2.id<3

where t1.status=‘1’; 2

  1. ID NAME                           ST         ID MOBILE 
  2.     1 a                              1           1 12345  
  3.     2 b                              1           2 23456 
  4.     5 e                              1 
  5.     4 d                              1 
  6.     3 c                              1 

當(dāng)把對(duì)右表的過濾寫在on后面,先對(duì)兩表進(jìn)行過濾,再進(jìn)行l(wèi)eft join,顯示結(jié)果集與寫在where后面是不同的,連接方式還是左外連接,顯示t1過濾后的全部數(shù)據(jù)。

(4)右表的謂詞寫在where后面,左表的謂詞寫在on后面:

SQL> select * from t1 left join t2 on t1.id=t2.id and t1.status=‘1’ where t2.id<7;

  1. ID NAME                           ST         ID MOBILE 
  2.      1 a                              1           1 12345 
  3.      2 b                              1           2 23456 
  4.      3 c                              1           3 34567 

從執(zhí)行計(jì)劃看這種情況左連接轉(zhuǎn)換為內(nèi)連接,左表的謂詞條件寫在哪個(gè)位置都一樣。而且因?yàn)閠2表過濾后數(shù)據(jù)比t1表少,CBO把t2表當(dāng)成了驅(qū)動(dòng)表。

接下來我們?cè)倏匆粋€(gè)語句:

SQL> select * from t1 left join t2 on t1.id=t2.id and t1.status=‘1’

where t1.status=‘0’ ;

  1. ID NAME                           ST         ID MOBILE 
  2.    8 h                              0 
  3.    6 f                              0 
  4.    9 i                              0 
  5.   10 j                              0 
  6.    7 g                              0 

從執(zhí)行計(jì)劃看出,雖然t2表返回0行,步驟3上的filter條件肯定不成立,但有邏輯讀消耗,所以推斷它依然進(jìn)行了全表掃描,所以這種語句對(duì)t2表的掃描是對(duì)資源的一種浪費(fèi),沒有意義。或許你會(huì)覺得誰會(huì)這么無聊寫這種SQL,但是在開發(fā)過程中,SQL語句經(jīng)常是各種過濾條件組合經(jīng)過拼接而成,因?yàn)榉祷亟Y(jié)果是對(duì)的,他們意識(shí)不到會(huì)出現(xiàn)這種問題,在此說明此種情況主要是想說明一件事:不要總想著用一個(gè)語句來解決所有的功能需求,適當(dāng)?shù)牟鸱謱?duì)性能的提升是很有必要的。

3.right join

右連接與左連接是相似的,只不過是右表顯示全部數(shù)據(jù),寫在on后面謂詞過濾對(duì)右表不起作用,在此不再舉例說明。

4.full join

全連接在應(yīng)用中似乎很少碰到,但是存在即合理,只是自己沒有遇到而已。

(1)兩個(gè)表的謂詞都放在on的后面:

這種情況不會(huì)先對(duì)兩個(gè)表過濾,而是作為連接條件過濾,符合連接就匹配上,不符合的就把左右兩表的數(shù)據(jù)都顯示出來,另一表的字段以空顯示。

(2)兩個(gè)表的謂詞都放在where后面:

這種情況CBO將其轉(zhuǎn)換為內(nèi)連接,先過濾再關(guān)聯(lián)。

(3)左表謂詞放在on后面,右表放在where后面:

這種情況轉(zhuǎn)換為右外連接,但是也是先對(duì)兩表過濾后再關(guān)聯(lián)。

(4)左表謂詞放在where后面,右表放在on后面:

這種情況轉(zhuǎn)換為左外連接,也是先對(duì)兩表過濾后再關(guān)聯(lián)。

總結(jié)

1.對(duì)于內(nèi)連接inner join,兩個(gè)表的謂詞條件放在on與where后面相同。

2.對(duì)于left join:

左表謂詞放在on后不會(huì)對(duì)左表數(shù)據(jù)進(jìn)行過濾,依然顯示左表全部數(shù)據(jù),放在where后面才會(huì)對(duì)左表進(jìn)行過濾

右表謂詞不管放在on后還是where后都會(huì)對(duì)右表先過濾再連接,但是放在where后left join會(huì)轉(zhuǎn)換為inner join。

3.對(duì)于外連接,謂詞條件放的位置不同,結(jié)果集也不同,可以根據(jù)自己的需求斟酌使用。

關(guān)于作者

于志軍,云和恩墨技術(shù)顧問,Oracle 12c OCM。擁有OCM、OBCA證書,曾在某大型國企做過多年數(shù)據(jù)庫運(yùn)維工作,現(xiàn)駐場(chǎng)于某銀行,專門從事SQL性能優(yōu)化工作,熱衷于運(yùn)維故障處理、備份恢復(fù)、升級(jí)遷移、性能優(yōu)化的學(xué)習(xí)與分享。

 

責(zé)任編輯:武曉燕 來源: 數(shù)據(jù)和云
相關(guān)推薦

2009-09-25 10:22:35

Hibernate多表

2010-05-18 14:14:03

MySQL關(guān)聯(lián)left

2012-06-05 02:20:24

JPAJava查詢語言

2017-07-25 15:35:07

MysqlMysql優(yōu)化LIMIT分頁

2020-11-05 10:59:45

Mybatis

2023-05-26 14:08:00

Where 條件MySQL

2010-10-21 11:10:57

SQL Server查

2010-06-03 09:24:46

Oracle

2023-11-14 09:08:12

MySQL多表關(guān)聯(lián)

2021-10-12 05:00:27

PandasSQL查詢

2010-10-14 14:33:15

MySQL多表聯(lián)查

2015-03-18 13:18:45

MySQLSQL優(yōu)化

2010-10-14 14:28:03

Mysql多表查詢

2010-11-22 15:56:34

Mysql多表查詢

2011-08-23 09:45:34

SQL Server多表關(guān)聯(lián)匯總查詢

2011-06-28 14:02:49

表分區(qū)

2022-07-01 13:42:11

項(xiàng)目管理企業(yè)架構(gòu)IT

2024-10-05 00:00:10

SQL語句指定連接條

2022-07-05 10:50:31

數(shù)據(jù)庫查詢實(shí)戰(zhàn)

2023-12-26 16:14:43

點(diǎn)贊
收藏

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

伊人久久婷婷| 日韩一区二区三区电影在线观看 | 99久久久精品视频| 美女黄色片网站| 国产探花一区在线观看| 久久国产精品久久久久久久久久| av福利在线导航| 色国产综合视频| 992tv成人国产福利在线| 久久久久久久久久久电影| 黄色网在线视频| 久久国产人妖系列| 欧美污视频久久久| 国产美女诱惑一区二区| 国产主播一区二区三区四区| 欧美精品入口| 国产精品久久久久久久久久久久午夜片 | 99久久久国产精品美女| 国产成人精品综合| 精品国产乱子伦一区二区| 在线观看日韩欧美| 国产成人a视频高清在线观看| 亚洲美女在线视频| 3d欧美精品动漫xxxx无尽| 亚洲免费一级电影| 日韩制服一区| 国产亚洲精品成人av久久ww| 日本成人伦理电影| 中文字幕日本欧美| 欧美a级黄色大片| 日韩中文字幕亚洲一区二区va在线 | 99国产精品久久久| 欧美成人精品欧美一级乱| 成人av网站免费| 波多野结衣家庭教师视频| 久久精品一区二区三区av| 亚洲精品一二三四五区| 一区二区免费视频| 猫咪在线永久网站| 日韩免费在线观看| 在线天堂资源| 欧美成人激情视频| 一区二区三区日本久久久| 91视频国产高清| 国产视频欧美| av一区二区三区免费观看| 国产欧美日产一区| 97国产在线| 日韩欧美三级在线| 美脚恋feet久草欧美| 久久久久这里只有精品| 日韩av大片| 日韩电影免费观看高清完整| 国产aⅴ精品一区二区三区色成熟| 黄色片久久久久| 亚洲成人中文在线| 日韩在线观看www| 在线播放日韩欧美| 国产成人黄色| 色综合视频二区偷拍在线| 久久精品人人做人人爽97| 手机福利在线| 亚洲欧美国产精品| 一区二区三区韩国免费中文网站| 精品一区二区三区自拍图片区| 国产成人免费在线| 中文字幕视频在线| 在线观看亚洲视频| 中文在线播放一区二区| 国产人妻777人伦精品hd| 午夜欧美2019年伦理 | 色菇凉天天综合网| 色综合天天色| 亚洲已满18点击进入在线看片| 久久99精品久久久久久久久久久久| 中文字幕天天干| 日韩欧美在线影院| 蜜桃国内精品久久久久软件9| 日韩欧美精品一区二区三区经典| 91视频观看视频| 宅男在线观看免费高清网站| 国内揄拍国内精品少妇国语| 久久九九电影| 久久久久久77777| 亚洲欧美在线一区| 亚洲第一伊人| 国产特级毛片| 丝袜情趣国产精品| 国产亚洲精品bv在线观看| 97午夜影院| 最近2019免费中文字幕视频三 | 国产精品直播网红| 床上的激情91.| 欧美18一19xxx性| 国产精品999999| 久久综合九色综合久久久精品综合 | 日韩精品三区四区| 91精品国产一区二区三密臀| 亚洲午夜色婷婷在线| 99成人在线视频| 天天色综合6| 在线色欧美三级视频| 久久影院亚洲| 国产裸舞福利在线视频合集| 日本精品视频在线观看| 2021久久国产精品不只是精品| 神马午夜伦理不卡| 动漫美女被爆操久久久| 亚洲在线中文字幕| 成人涩涩网站| 日韩欧美国产免费| 亚洲美腿欧美激情另类| 美女尤物久久精品| 日韩三级电影网| 国产精品极品尤物在线观看 | www.久久爱.com| 综合一区中文字幕| 7777精品伊人久久久大香线蕉最新版| 成人网18免费网站| av二区三区| 97av在线视频| 国产精品麻豆久久久| 国产在线不卡一区二区三区| 99视频精品全部免费看| 亚洲成人久久网| 日本欧美在线观看| 色婷婷视频在线观看| 麻豆视频成人| 日韩视频免费直播| 久久精品女人天堂| 2024短剧网剧在线观看| 久久精品综合一区| 91精品久久久久久久久99蜜臂| 在线欧美亚洲| 99福利在线| 在线观看成人av电影| 精品亚洲一区二区三区在线播放 | 成人av资源| 欧美色男人天堂| 亚洲大胆在线| h视频在线免费观看| 欧美在线激情| 亚洲男人天堂2023| 成人黄色大片在线观看 | 日韩亚洲一区二区| 一区视频在线看| 国产毛片av在线| 亚洲欧美日韩精品| 久久久精品国产亚洲| 国产一区二区三区网站| 国产一区二区三区av电影 | 亚洲日本va中文字幕久久| 成人av网在线| 成人免费无遮挡| 国产无限制自拍| 久久综合伊人77777尤物| 亚洲国产成人午夜在线一区| 少妇精品导航| 在线亚洲电影| 欧美一级片免费观看| 亚洲视频在线看| 中文字幕不卡在线观看| 日韩一区二区中文| 成人片在线看| 人妻久久久一区二区三区| 欧美激情视频网| 亚洲国产wwwccc36天堂| 一本综合久久| 国产91亚洲精品久久久| 电影天堂最新网址| 国产综合欧美在线看| 一区二区三区回区在观看免费视频| 欧美激情在线观看视频免费| 99精品电影| 都市激情国产精品| 尤蜜粉嫩av国产一区二区三区| 91美女高潮出水| 亚洲欧美一区二区精品久久久| 精品一区二区在线视频| 欧美毛片免费观看| 国产原创在线观看| 男人透女人免费视频| 亚洲男子天堂网| 欧美亚洲动漫精品| 综合136福利视频在线| 国产原创欧美精品| 欧美视频在线观看视频| 在线免费av播放| 欧美日韩在线播放一区| 国产一区二区在线免费观看| 老牛影视av一区二区在线观看| 最新av网站在线观看| aa视频在线播放| wwwxx欧美| 久久色在线播放| 在线观看国产精品网站| 2017欧美狠狠色| 一本色道久久综合亚洲精品高清| 欧美区一区二区| caopo在线|