麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 毛片网站视频 | 国产午夜精品一区二区三区不卡 | 精品亚洲夜色av98在线观看 | 羞羞网站在线观看入口免费 | 青草av.久久免费一区 | 国产欧美亚洲精品 | 美女视频免费一区二区 | sese在线视频 | 欧美日韩在线播放一区 | 欧美精品一区二区三区在线播放 | 免费观看国产精品视频 | www.9191.com| 曰批全过程120分钟免费69 | 欧美成人精品一区二区 | 国产精品视频一区二区三区四区国 | 亚洲电影在线观看高清免费 | 免费午夜视频在线观看 | 黄色7777| 日韩视频www | 久久狠狠高潮亚洲精品 | 久久久久久久久成人 | www国产成人免费观看视频 | 日本免费a∨ | 免费看日韩av| 日本在线播放一区 | 成人毛片网站 | 大学生一级毛片在线视频 | 国人精品视频在线观看 | 欧美一级鲁丝片免费看 | 黄色网址免费在线播放 | 欧美精品久久久久久久多人混战 | 成人在线视频免费播放 | 国产成人高清在线观看 | 黄色片免费在线播放 | 国产午夜精品久久久久 | 中文字幕亚洲欧美 | 欧美成人午夜一区二区三区 | 国产流白浆高潮在线观看 | 精品亚洲综合 | 国产亚洲精品影达达兔 | 国产v综合v亚洲欧美久久 |