亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

oracle中not exists對外層查詢的影響詳解

2024-08-29 13:59:46
字體:
來源:轉載
供稿:網友

前言

最近同事發現了一個問題,在12c中跑的buffer get很高,但是在10g中跑的buffer很低。懷疑是不是12c的優化器有問題。

這個10g的環境和12c的環境,數據量大致一樣,只是有很少部分的不同,但是就是這個很少部分不同,造成了not exists中的子查詢返回不同的值,進而對外層查詢產生不同的影響。

我們來用如下的代碼模擬一下。

初始化數據:

--10gdrop table t1;drop table t2; create table t1 (id number,name varchar2(20),dep_id varchar2(10));create table t2 (id number,name varchar2(20),dep_id varchar2(10)); insert into t1 select rownum,'a','kk' from dual connect by level <=3000000;insert into t2 select rownum,'a','kk' from dual connect by level <=1000000;insert into t2 select rownum,'a','mm' from dual; commit;  --12cdrop table t1;drop table t2; create table t1 (id number,name varchar2(20),dep_id varchar2(10));create table t2 (id number,name varchar2(20),dep_id varchar2(10));  insert into t1 select rownum,'a','kk' from dual connect by level <=3000000;insert into t2 select rownum,'a','kk' from dual connect by level <=1000000; commit;

我們看到,12c的數據和10g只是有很少的差別,t1表12c和10g都一樣,t2表在12c只是少了一行數據。

--10gSQL> select dep_id,count(*) from t1 group by dep_id; DEP_ID     COUNT(*)-------------------- ----------kk      3000000 SQL> select dep_id,count(*) from t2 group by dep_id; DEP_ID     COUNT(*)-------------------- ----------mm       1kk      1000000 SQL>  --12cSQL> select dep_id,count(*) from t1 group by dep_id; DEP_ID     COUNT(*)-------------------- ----------kk      3000000 SQL> select dep_id,count(*) from t2 group by dep_id; DEP_ID     COUNT(*)-------------------- ----------kk      1000000 SQL>

我們將要執行的sql語句是:

select count(*) from t1, t2 where t1.id = t2.id and t1.dep_id = 'kk' and not exists (select 1   from t1, t2   where t1.id = t2.id   and t2.dep_id = 'mm');

我們先來看執行情況的差距,10g的bufferget小,12c多:

--10gSQL> select /*+ gather_plan_statistics */ count(*) from t1,t2 where t1.id=t2.id and t1.dep_id='kk' and not exists (select 1 from t1,t2 where t1.id=t2.id and t2.dep_id='mm');  COUNT(*)----------   0 SQL> select* from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); PLAN_TABLE_OUTPUT----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID 22t5mb43w55pr, child number 0-------------------------------------select /*+ gather_plan_statistics */ count(*) from t1,t2 where t1.id=t2.id and t1.dep_id='kk' and notexists (select 1 from t1,t2 where t1.id=t2.id and t2.dep_id='mm') Plan hash value: 3404612428 ------------------------------------------------------------------------------------------------------------------| Id | Operation   | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |------------------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT  |  |  1 |  |  1 |00:00:00.02 | 2086 |  |  |   || 1 | SORT AGGREGATE  |  |  1 |  1 |  1 |00:00:00.02 | 2086 |  |  |   ||* 2 | FILTER    |  |  1 |  |  0 |00:00:00.02 | 2086 |  |  |   ||* 3 | HASH JOIN   |  |  0 | 901K|  0 |00:00:00.01 |  0 | 39M| 5518K|   || 4 |  TABLE ACCESS FULL| T2 |  0 | 901K|  0 |00:00:00.01 |  0 |  |  |   ||* 5 |  TABLE ACCESS FULL| T1 |  0 | 2555K|  0 |00:00:00.01 |  0 |  |  |   ||* 6 | HASH JOIN   |  |  1 |  23 |  1 |00:00:00.02 | 2086 | 1517K| 1517K| 612K (0)||* 7 |  TABLE ACCESS FULL| T2 |  1 |  23 |  1 |00:00:00.02 | 2082 |  |  |   || 8 |  TABLE ACCESS FULL| T1 |  1 | 2555K|  1 |00:00:00.01 |  4 |  |  |   |------------------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id):---------------------------------------------------  2 - filter( IS NULL) 3 - access("T1"."ID"="T2"."ID") 5 - filter("T1"."DEP_ID"='kk') 6 - access("T1"."ID"="T2"."ID") 7 - filter("T2"."DEP_ID"='mm') Note----- - dynamic sampling used for this statement  34 rows selected. SQL>  --12cSQL> select /*+ gather_plan_statistics */ count(*) from t1,t2 where t1.id=t2.id and t1.dep_id='kk' and not exists (select 1 from t1,t2 where t1.id=t2.id and t2.dep_id='mm');  COUNT(*)---------- 1000000 SQL> select* from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID 22t5mb43w55pr, child number 0-------------------------------------select /*+ gather_plan_statistics */ count(*) from t1,t2 wheret1.id=t2.id and t1.dep_id='kk' and not exists (select 1 from t1,t2where t1.id=t2.id and t2.dep_id='mm') Plan hash value: 1692274438 --------------------------------------------------------------------------------------------------------------------| Id | Operation    | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |--------------------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT  |  |  1 |  |  1 |00:00:00.79 | 10662 |  | |  || 1 | SORT AGGREGATE  |  |  1 |  1 |  1 |00:00:00.79 | 10662 |  | |  ||* 2 | FILTER    |  |  1 |  | 1000K|00:00:00.74 | 10662 |  | |  ||* 3 | HASH JOIN   |  |  1 | 1215K| 1000K|00:00:00.52 | 8579 | 43M| 6111K| 42M (0)|| 4 |  TABLE ACCESS FULL | T2 |  1 | 1215K| 1000K|00:00:00.01 | 2083 |  | |  ||* 5 |  TABLE ACCESS FULL | T1 |  1 | 2738K| 3000K|00:00:00.07 | 6496 |  | |  ||* 6 | HASH JOIN RIGHT SEMI|  |  1 |  35 |  0 |00:00:00.02 | 2083 | 1245K| 1245K| 461K (0)||* 7 |  TABLE ACCESS FULL | T2 |  1 |  23 |  0 |00:00:00.02 | 2083 |  | |  || 8 |  TABLE ACCESS FULL | T1 |  0 | 2738K|  0 |00:00:00.01 |  0 |  | |  |-------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):---------------------------------------------------  2 - filter( IS NULL) 3 - access("T1"."ID"="T2"."ID") 5 - filter("T1"."DEP_ID"='kk') 6 - access("T1"."ID"="T2"."ID") 7 - filter("T2"."DEP_ID"='mm') Note----- - dynamic statistics used: dynamic sampling (level=2)  35 rows selected. SQL>SQL>

可以看到第23,24行,在10g中運行時,buffers是0,而在12c中,即78,79行,buffer是2083+6496。

也就是說在10g中,外層查詢不進行t1和t2的掃描,直接返回結果了,而在12c中,外層查詢還要進行t1表和t2表層掃描才返回結果。

這其實不是10g和12c的差別,而是not exists的返回數據對外層的影響。子查詢要返回0行記錄,才滿足not exist的條件,從而返回外層查詢結果。

在10g中,子查詢返回了一行記錄

--10gSQL> select 1 from t1,t2 where t1.id=t2.id and t2.dep_id='mm';    1----------   1 SQL>

不滿足not exists(即0行才滿足),所以,也就不用在外層繼續查詢了。直接返回記錄0行。

在12c中,子查詢返回0行記錄,滿足not exist的條件,所以還需要在外層查詢中繼續查詢。

--12cSQL> select count(*) from t1,t2 where t1.id=t2.id and t2.dep_id='kk';  COUNT(*)---------- 1000000 SQL> set line 1000SQL> set pages 1000SQL> col PLAN_TABLE_OUTPUT for a250SQL>SQL>SQL> select /*+ gather_plan_statistics */ count(*) from t1,t2 where t1.id=t2.id and t1.dep_id='kk' and not exists (select 1 from t1,t2 where t1.id=t2.id and t2.dep_id='kk');  COUNT(*)----------   0 SQL> select* from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); PLAN_TABLE_OUTPUT---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID c5hj2p2jt1fxf, child number 0-------------------------------------select /*+ gather_plan_statistics */ count(*) from t1,t2 wheret1.id=t2.id and t1.dep_id='kk' and not exists (select 1 from t1,t2where t1.id=t2.id and t2.dep_id='kk') Plan hash value: 1692274438 --------------------------------------------------------------------------------------------------------------------| Id | Operation    | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |--------------------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT  |  |  1 |  |  1 |00:00:00.28 | 2087 |  | |  || 1 | SORT AGGREGATE  |  |  1 |  1 |  1 |00:00:00.28 | 2087 |  | |  ||* 2 | FILTER    |  |  1 |  |  0 |00:00:00.28 | 2087 |  | |  ||* 3 | HASH JOIN   |  |  0 | 1215K|  0 |00:00:00.01 |  0 | 69M| 7428K|   || 4 |  TABLE ACCESS FULL | T2 |  0 | 1215K|  0 |00:00:00.01 |  0 |  | |  ||* 5 |  TABLE ACCESS FULL | T1 |  0 | 2738K|  0 |00:00:00.01 |  0 |  | |  ||* 6 | HASH JOIN RIGHT SEMI|  |  1 | 2738K|  1 |00:00:00.28 | 2087 | 43M| 6111K| 42M (0)||* 7 |  TABLE ACCESS FULL | T2 |  1 | 1215K| 1000K|00:00:00.12 | 2083 |  | |  || 8 |  TABLE ACCESS FULL | T1 |  1 | 2738K|  1 |00:00:00.01 |  4 |  | |  |-------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):---------------------------------------------------  2 - filter( IS NULL) 3 - access("T1"."ID"="T2"."ID") 5 - filter("T1"."DEP_ID"='kk') 6 - access("T1"."ID"="T2"."ID") 7 - filter("T2"."DEP_ID"='kk') Note----- - dynamic statistics used: dynamic sampling (level=2)  35 rows selected. SQL>

可以看到第38,39行的buffer為0.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久国产精品三级玉女聊斋| 久久午夜a级毛片| 国产午夜精品免费一区二区三区| 狠狠色香婷婷久久亚洲精品| 久久精品青青大伊人av| 亚洲激情免费观看| www.亚洲男人天堂| 欧美激情a∨在线视频播放| 久热精品视频在线| 国产热re99久久6国产精品| 在线观看亚洲区| 亚洲欧美综合精品久久成人| 国产女人18毛片水18精品| zzijzzij亚洲日本成熟少妇| 米奇精品一区二区三区在线观看| 欧美亚洲日本网站| 久久久久久久久久久亚洲| 欧美午夜无遮挡| 欧美孕妇毛茸茸xxxx| 日本精品久久久久影院| 一个色综合导航| 国产精品一区二区电影| 66m—66摸成人免费视频| 成人午夜在线视频一区| 久久久久久成人精品| 国产精品av在线播放| 国产女人精品视频| 97久久精品国产| 综合网日日天干夜夜久久| 成人在线播放av| 久久久久中文字幕2018| 97视频网站入口| 亚洲白拍色综合图区| 久久av在线看| 日韩欧美高清视频| 欧美激情va永久在线播放| 日韩精品亚洲元码| 97在线视频免费看| 国产丝袜精品第一页| 国自产精品手机在线观看视频| 国产91色在线播放| 国产成人精品视频在线观看| 久久久综合av| 日韩av日韩在线观看| 日韩欧美国产黄色| 日韩在线免费观看视频| 一区二区三区天堂av| 91精品国产乱码久久久久久久久| 亚洲乱码一区av黑人高潮| 国产精品福利无圣光在线一区| 国产精品一区专区欧美日韩| 久久香蕉国产线看观看网| 国产91精品高潮白浆喷水| 在线观看国产欧美| 日韩在线视频二区| 精品色蜜蜜精品视频在线观看| 国产69精品久久久久99| 在线激情影院一区| 亚洲人午夜精品免费| 51精品在线观看| 欧美日韩国产精品一区二区三区四区| 91成人在线播放| 亚洲а∨天堂久久精品9966| 深夜福利国产精品| 亚洲成人性视频| 国语自产精品视频在免费| 亚洲毛片在线观看.| 亚洲综合第一页| 色777狠狠综合秋免鲁丝| 日韩av网站导航| 国产亚洲成精品久久| 成人网中文字幕| 国产精品欧美日韩| 亚洲精品国精品久久99热一| 一本一本久久a久久精品综合小说| 久久久久久网址| 亚洲精品不卡在线| 亚洲伊人久久综合| 久久久视频免费观看| 国产亚洲成精品久久| 国产成人+综合亚洲+天堂| 国产精品久久久久久中文字| 亚洲第一页中文字幕| 亚洲成avwww人| 国产美女久久久| 精品久久久久久久久久国产| 亚洲日本欧美日韩高观看| 午夜精品久久久久久久99黑人| 日韩免费观看视频| 成人免费大片黄在线播放| 中文字幕日韩免费视频| 国产成人精品在线| 一区二区日韩精品| 国产精品www网站| 国精产品一区一区三区有限在线| 911国产网站尤物在线观看| 久久精品国产96久久久香蕉| 国产成人涩涩涩视频在线观看| 国产欧美欧洲在线观看| 国产成人av网| 亚洲精品美女在线| 欧美性受xxx| 国产91在线播放精品91| 欧美激情一区二区三区久久久| 日本欧美一二三区| zzjj国产精品一区二区| 欧洲美女7788成人免费视频| 日韩av在线免播放器| 欧美日韩裸体免费视频| 91在线免费观看网站| 91精品国产高清久久久久久91| 欧美性猛交xxxx黑人猛交| 亚洲级视频在线观看免费1级| 91免费视频网站| 久久电影一区二区| 日韩中文字幕免费看| 久久色免费在线视频| 欧美在线视频在线播放完整版免费观看| 欧美日韩亚洲视频| 51色欧美片视频在线观看| 最近2019中文字幕一页二页| 亚洲综合在线做性| 欧美色另类天堂2015| 国产一区视频在线播放| 国产精品高潮视频| 久久久999精品视频| 亚洲天堂一区二区三区| 久久久久久久久久久久久久久久久久av| 日日噜噜噜夜夜爽亚洲精品| 91精品视频大全| 亚洲天堂成人在线视频| 欧美激情国产精品| 国产精品视频不卡| 26uuu日韩精品一区二区| 国产a∨精品一区二区三区不卡| 久久精品视频中文字幕| 亚洲第一精品久久忘忧草社区| 青青草原一区二区| 国产在线精品一区免费香蕉| 国产精品久久久久久久久久久新郎| 亚洲国产精品99久久| 国产精品久久久久久久久久新婚| 91免费在线视频网站| 亚洲第一区中文字幕| 国产精品视频区| 亚洲天堂网在线观看| 久久久之久亚州精品露出| 日韩激情av在线免费观看| 精品福利一区二区| 日本中文字幕不卡免费| 欧美性20hd另类| 欧美在线观看网站| 在线观看欧美日韩| 国产精品极品尤物在线观看| 亚洲精品在线看| 欧美美最猛性xxxxxx| 奇米4444一区二区三区| 久久精品视频中文字幕| 亚洲视频日韩精品| 日韩大胆人体377p| 久久综合九色九九| 久久免费成人精品视频| 亚洲欧美日韩另类| 岛国av一区二区三区|