找回密码
 立即注册
首页 业界区 业界 性能调优:JPPD(连接谓词下推)客户案例模拟 ...

性能调优:JPPD(连接谓词下推)客户案例模拟

遗憩 2025-6-17 21:10:22
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
  1. 前面几天发了几篇JPPD文章,今天就来演示一下客户现场遇到真实案例的模拟,这个在客户现场优化SQL时遇到连接谓词推入不成功的案例,由于但是客户正式环境不允许操作,有没有测试环境,没有办法测试,下面是在自己的虚拟机里面演示一下,优化后能带来的性能提升。
复制代码
1,环境介绍

本次实验是基于11.2.0.4环境,其它环境在默认情况下可能结果会不一致。
  1. www.htz.pw > select * from v$version where rownum<4;
  2. BANNER
  3. --------------------------------------------------------------------------------
  4. Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
  5. www.htz.pw > !lsb_release -a
  6. Description:    Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
复制代码
2,参数配置

下面参数都为默认情况下的配置
  1. SELECT a.ksppinm AS parameter,">  2         b.ksppstvl AS session_value,
  2.   3         c.ksppstvl AS instance_value,
  3.   4         a.ksppdesc AS description
  4.   5  FROM   x$ksppi a,
  5.   6         x$ksppcv b,
  6.   7         x$ksppsv c
  7.   8  WHERE  a.indx = b.indx
  8.   9  AND    a.indx = c.indx
  9. 10  AND    a.ksppinm LIKE '/_%' ESCAPE '/'
  10. 11  AND    (a.ksppinm in ('_push_join_predicate','_optimizer_push_pred_cost_based','_optimizer_extend_jppd_view_types'))
  11. 12  ORDER BY a.ksppinm
  12. 13  /
  13. PARAMETER                           S_VALUE   D_VALUE  DESCRIPTION
  14. ----------------------------------- -------   -------- ----------------------------------------------------------------
  15. _optimizer_extend_jppd_view_types   TRUE      TRUE     join pred pushdown on group-by, distinct, semi-/anti-joined view
  16. _optimizer_push_pred_cost_based     TRUE      TRUE     use cost-based query transformation for push pred optimization
  17. _push_join_predicate                TRUE      TRUE     enable pushing join predicate inside a view
复制代码
3,创建测试表

这里都是基于dba_objects视图创建的。
  1. www.htz.pw > create table scott.htz1 as select * from dba_objects;
  2. www.htz.pw > create table scott.htz2 as select * from dba_objects;
  3. www.htz.pw > create table scott.htz3 as select * from dba_objects;
复制代码
4,语句一测试

下面这个SQL还回是0行,其实出view,SQL本来也就是还回0行,这个还回的行数直接影响到我们的测试结果。
  1.     FROM scott.htz1 a,
  2.          scott.htz2 b,
  3.          (  SELECT COUNT (*) COUNT, owner
  4.               FROM scott.htz3 c
  5.              WHERE c.object_id > 1000
  6.           GROUP BY owner) d
  7.    WHERE     a.owner = b.owner
  8.          AND a.object_id > b.object_id
  9.          AND b.CREATED > SYSDATE - 1
  10.          AND a.owner = d.owner;
复制代码
4.1 默认情况
  1.     FROM scott.htz1 a,
  2.          scott.htz2 b,
  3.          (  SELECT COUNT (*) COUNT, owner
  4.               FROM scott.htz3 c
  5.              WHERE c.object_id > 1000
  6.           GROUP BY owner) d
  7.    WHERE     a.owner = b.owner
  8.          AND a.object_id > b.object_id
  9.          AND b.CREATED > SYSDATE - 1
  10.          AND a.owner = d.owner;no rows selectedExecution Plan----------------------------------------------------------Plan hash value: 2675592091-------------------------------------------------------------------------------------| Id  | Operation            | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |-------------------------------------------------------------------------------------|   0 | SELECT STATEMENT     |      |    42M|    17G|       |  1447   (9)| 00:00:18 ||*  1 |  HASH JOIN           |      |    42M|    17G|  2408K|  1447   (9)| 00:00:18 ||*  2 |   HASH JOIN          |      |  5771 |  2333K|       |   692   (1)| 00:00:09 ||*  3 |    TABLE ACCESS FULL | HTZ2 |    14 |  2898 |       |   346   (1)| 00:00:05 ||   4 |    TABLE ACCESS FULL | HTZ1 | 99677 |    19M|       |   345   (1)| 00:00:05 ||   5 |   VIEW               |      | 88109 |  2581K|       |   348   (2)| 00:00:05 ||   6 |    HASH GROUP BY     |      | 88109 |  2581K|       |   348   (2)| 00:00:05 ||*  7 |     TABLE ACCESS FULL| HTZ3 | 88109 |  2581K|       |   345   (1)| 00:00:05 |-------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - access("A"."OWNER"="D"."OWNER")   2 - access("A"."OWNER"="B"."OWNER")       filter("A"."OBJECT_ID">"B"."OBJECT_ID")   3 - filter("B"."CREATED">SYSDATE@!-1)   7 - filter("C"."OBJECT_ID">1000)Note-----   - dynamic sampling used for this statement (level=2)Statistics----------------------------------------------------------          0  recursive calls          0  db block gets       2480  consistent gets          0  physical reads          0  redo size       2554  bytes sent via SQL*Net to client        512  bytes received via SQL*Net from client          1  SQL*Net roundtrips to/from client          0  sorts (memory)          0  sorts (disk)          0  rows processed
复制代码
这里看到整个SQL逻辑读是2480,也消耗了TEMPSPC为2408K.
4.2 强制连接列谓词推入
  1. SELECT /*+ push_pred(d)*/">  2        *
  2.   3    FROM scott.htz1 a,
  3.   4         scott.htz2 b,
  4.   5         (  SELECT COUNT (*) COUNT, owner
  5.   6              FROM scott.htz3 c
  6.   7             WHERE c.object_id > 1000
  7.   8          GROUP BY owner) d
  8.   9   WHERE     a.owner = b.owner
  9. 10         AND a.object_id > b.object_id
  10. 11         AND b.CREATED > SYSDATE - 1
  11. 12         AND a.owner = d.owner;
  12. no rows selected
  13. Execution Plan
  14. ----------------------------------------------------------
  15. Plan hash value: 1009835727
  16. --------------------------------------------------------------------------------
  17. | Id  | Operation               | Name | Rows  | Bytes | Cost (%CPU)| Time     |
  18. --------------------------------------------------------------------------------
  19. |   0 | SELECT STATEMENT        |      |    42M|    16G|  1990K  (1)| 06:38:11 |
  20. |   1 |  NESTED LOOPS           |      |    42M|    16G|  1990K  (1)| 06:38:11 |
  21. |*  2 |   HASH JOIN             |      |  5771 |  2333K|   692   (1)| 00:00:09 |
  22. |*  3 |    TABLE ACCESS FULL    | HTZ2 |    14 |  2898 |   346   (1)| 00:00:05 |
  23. |   4 |    TABLE ACCESS FULL    | HTZ1 | 99677 |    19M|   345   (1)| 00:00:05 |
  24. |   5 |   VIEW PUSHED PREDICATE |      |     1 |    13 |   345   (1)| 00:00:05 |
  25. |*  6 |    FILTER               |      |       |       |            |          |
  26. |   7 |     SORT AGGREGATE      |      |     1 |    30 |            |          |
  27. |*  8 |      TABLE ACCESS FULL  | HTZ3 |   881 | 26430 |   345   (1)| 00:00:05 |
  28. --------------------------------------------------------------------------------
  29. Predicate Information (identified by operation id):
  30. ---------------------------------------------------
  31.    2 - access("A"."OWNER"="B"."OWNER")
  32.        filter("A"."OBJECT_ID">"B"."OBJECT_ID")
  33.    3 - filter("B"."CREATED">SYSDATE@!-1)
  34.    6 - filter(COUNT(*)>0)
  35.    8 - filter("OWNER"="A"."OWNER" AND "C"."OBJECT_ID">1000)
  36. Note
  37. -----
  38.    - dynamic sampling used for this statement (level=2)
  39. Statistics
  40. ----------------------------------------------------------
  41.           0  recursive calls
  42.           0  db block gets
  43.        2480  consistent gets
  44.           0  physical reads
  45.           0  redo size
  46.        2554  bytes sent via SQL*Net to client
  47.         512  bytes received via SQL*Net from client
  48.           1  SQL*Net roundtrips to/from client
  49.           0  sorts (memory)
  50.           0  sorts (disk)
  51.           0  rows processed
复制代码
这里消耗的逻辑读也是2480,但是tempspc为0.但是这里ORACLE自己估算出来谓词推入成本更高。
4.3 连接列创建索引
  1. SELECT /*+ push_pred(d)*/">  2        *
  2.   3    FROM scott.htz1 a,
  3.   4         scott.htz2 b,
  4.   5         (  SELECT COUNT (*) COUNT, owner
  5.   6              FROM scott.htz3 c
  6.   7             WHERE c.object_id > 1000
  7.   8          GROUP BY owner) d
  8.   9   WHERE     a.owner = b.owner
  9. 10         AND a.object_id > b.object_id
  10. 11         AND b.CREATED > SYSDATE - 1
  11. 12         AND a.owner = d.owner;
  12. no rows selected
  13. Execution Plan
  14. ----------------------------------------------------------
  15. Plan hash value: 3435586372
  16. ----------------------------------------------------------------------------------------------
  17. | Id  | Operation                       | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
  18. ----------------------------------------------------------------------------------------------
  19. |   0 | SELECT STATEMENT                |            |    42M|    16G|   104K  (1)| 00:20:56 |
  20. |   1 |  NESTED LOOPS                   |            |    42M|    16G|   104K  (1)| 00:20:56 |
  21. |*  2 |   HASH JOIN                     |            |  5771 |  2333K|   692   (1)| 00:00:09 |
  22. |*  3 |    TABLE ACCESS FULL            | HTZ2       |    14 |  2898 |   346   (1)| 00:00:05 |
  23. |   4 |    TABLE ACCESS FULL            | HTZ1       | 99677 |    19M|   345   (1)| 00:00:05 |
  24. |   5 |   VIEW PUSHED PREDICATE         |            |     1 |    13 |    18   (0)| 00:00:01 |
  25. |*  6 |    FILTER                       |            |       |       |            |          |
  26. |   7 |     SORT AGGREGATE              |            |     1 |    30 |            |          |
  27. |*  8 |      TABLE ACCESS BY INDEX ROWID| HTZ3       |   881 | 26430 |    18   (0)| 00:00:01 |
  28. |*  9 |       INDEX RANGE SCAN          | IND_HTZ3_1 |   352 |       |     8   (0)| 00:00:01 |
  29. ----------------------------------------------------------------------------------------------
  30. Predicate Information (identified by operation id):
  31. ---------------------------------------------------
  32.    2 - access("A"."OWNER"="B"."OWNER")
  33.        filter("A"."OBJECT_ID">"B"."OBJECT_ID")
  34.    3 - filter("B"."CREATED">SYSDATE@!-1)
  35.    6 - filter(COUNT(*)>0)
  36.    8 - filter("C"."OBJECT_ID">1000)
  37.    9 - access("OWNER"="A"."OWNER")
  38. Note
  39. -----
  40.    - dynamic sampling used for this statement (level=2)
  41. Statistics
  42. ----------------------------------------------------------
  43.           0  recursive calls
  44.           0  db block gets
  45.        2480  consistent gets
  46.           0  physical reads
  47.           0  redo size
  48.        2554  bytes sent via SQL*Net to client
  49.         512  bytes received via SQL*Net from client
  50.           1  SQL*Net roundtrips to/from client
  51.           0  sorts (memory)
  52.           0  sorts (disk)
  53.           0  rows processed
复制代码
这里可以看到,逻辑读变,但是ORACLE的估算成本在这里下将了。
4.4 总结

上面结果是SQL不包括视图时执行还回的结果为0,几种方式的逻辑读基本没有发生变化。
5,语句二测试

下面这个SQL是有结果集还回的
  1.    FROM scott.htz1 a,
  2.         scott.htz2 b,
  3.         (  SELECT COUNT (*) COUNT, owner
  4.              FROM scott.htz3 c
  5.             WHERE c.object_id > 1000
  6.          GROUP BY owner) d
  7.   WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
  8. 18 rows selected.
复制代码
可以看到还回了18行记录
5.1 默认情况
  1.    FROM scott.htz1 a,
  2.         scott.htz2 b,
  3.         (  SELECT COUNT (*) COUNT, owner
  4.              FROM scott.htz3 c
  5.             WHERE c.object_id > 1000
  6.          GROUP BY owner) d
  7.   WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
  8. 18 rows selected.Elapsed: 00:00:00.05Execution Plan----------------------------------------------------------Plan hash value: 1337491101-------------------------------------------------------------------------------------| Id  | Operation            | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |-------------------------------------------------------------------------------------|   0 | SELECT STATEMENT     |      |   847M|   350G|       |  5837  (40)| 00:01:11 ||*  1 |  HASH JOIN           |      |   847M|   350G|  3616K|  5837  (40)| 00:01:11 ||   2 |   VIEW               |      | 88109 |  2581K|       |   348   (2)| 00:00:05 ||   3 |    HASH GROUP BY     |      | 88109 |  2581K|       |   348   (2)| 00:00:05 ||*  4 |     TABLE ACCESS FULL| HTZ3 | 88109 |  2581K|       |   345   (1)| 00:00:05 ||*  5 |   HASH JOIN          |      |   115K|    45M|       |   692   (1)| 00:00:09 ||*  6 |    TABLE ACCESS FULL | HTZ2 |    14 |  2898 |       |   346   (1)| 00:00:05 ||   7 |    TABLE ACCESS FULL | HTZ1 | 99677 |    19M|       |   345   (1)| 00:00:05 |-------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - access("A"."OWNER"="D"."OWNER")   4 - filter("C"."OBJECT_ID">1000)   5 - access("A"."OWNER"="B"."OWNER")   6 - filter("B"."CREATED">SYSDATE@!-1)Note-----   - dynamic sampling used for this statement (level=2)Statistics----------------------------------------------------------         28  recursive calls          0  db block gets       4385  consistent gets          0  physical reads          0  redo size       4536  bytes sent via SQL*Net to client        534  bytes received via SQL*Net from client          3  SQL*Net roundtrips to/from client          7  sorts (memory)          0  sorts (disk)         18  rows processed
复制代码
这里看到SQL的逻辑读是4385,TEMP消耗3616.
5.2 连接列创建索引

www.htz.pw >  create index scott.ind_htz3_1 on scott.htz3(owner);
Index created.
Elapsed: 00:00:00.08
www.htz.pw > SELECT *
2    FROM scott.htz1 a,
3         scott.htz2 b,
4         (  SELECT COUNT (*) COUNT, owner
5              FROM scott.htz3 c
6             WHERE c.object_id > 1000
7          GROUP BY owner) d
8   WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
18 rows selected.
Elapsed: 00:00:00.03
Execution Plan

Plan hash value: 3445613030
ç
这里看到逻辑读降到3719,COST也降到1095了。
5.3 强制谓词推入
  1. SELECT /*+ push_pred(d)*/">  2        *
  2.   3    FROM scott.htz1 a,
  3.   4         scott.htz2 b,
  4.   5         (  SELECT COUNT (*) COUNT, owner
  5.   6              FROM scott.htz3 c
  6.   7             WHERE c.object_id > 1000
  7.   8          GROUP BY owner) d
  8.   9   WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
  9.   FROM scott.htz1 a,
  10.              *
  11. ERROR at line 3:
  12. ORA-01013: user requested cancel of current operation
  13. Elapsed: 00:05:19.68
复制代码
运行很久没有结果
  1. @sql_monitor_by_sqlid.sql">Enter value for sqlid: fkkvkv27pgqbx
  2. SQL Monitoring Report
  3. SQL Text
  4. ------------------------------
  5. SELECT /*+ push_pred(d)*/ * FROM scott.htz1 a, scott.htz2 b, ( SELECT COUNT (*) COUNT, owner FROM scott.htz3 c WHERE c.object_id > 1000 GROUP BY owner) d WHERE a.owner = b.owner AND b.CREATED > SYSDAT
  6. E - 1 AND a.owner = d.owner
  7. Global Information
  8. ------------------------------
  9. Status              :  EXECUTING
  10. Instance ID         :  1
  11. Session             :  SYS (26:7)
  12. SQL ID              :  fkkvkv27pgqbx
  13. SQL Execution ID    :  16777218
  14. Execution Started   :  04/20/2015 22:06:30
  15. First Refresh Time  :  04/20/2015 22:06:36
  16. Last Refresh Time   :  04/20/2015 22:08:19
  17. Duration            :  110s
  18. Module/Action       :  sqlplus@orcl9i (TNS V1-V3)/-
  19. Service             :  SYS$USERS
  20. Program             :  sqlplus@orcl9i (TNS V1-V3)
  21. Global Stats
  22. ===================================================================
  23. | Elapsed |   Cpu   |    IO    |  Other   | Buffer | Read | Read  |
  24. | Time(s) | Time(s) | Waits(s) | Waits(s) |  Gets  | Reqs | Bytes |
  25. ===================================================================
  26. |     108 |     108 |     0.00 |     0.51 |    14M |    2 | 49152 |
  27. ===================================================================
  28. SQL Plan Monitoring Details (Plan Hash Value=258155078)
  29. ======================================================================================================================================================================
  30. | Id   |              Operation              |    Name    |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Mem | Activity | Activity Detail |
  31. |      |                                     |            | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs | Bytes |     |   (%)    |   (# samples)   |
  32. ======================================================================================================================================================================
  33. |    0 | SELECT STATEMENT                    |            |         |      |           |        |     1 |          |      |       |     |          |                 |
  34. |    1 |   MERGE JOIN                        |            |     20M |  10M |           |        |     1 |          |      |       |     |          |                 |
  35. | -> 2 |    SORT JOIN                        |            |    702K |  10M |       104 |     +6 |     1 |        0 |      |       |  2M |          |                 |
  36. | -> 3 |     NESTED LOOPS                    |            |    702K |  10M |       104 |     +6 |     1 |    14028 |      |       |     |          |                 |
  37. | -> 4 |      TABLE ACCESS FULL              | HTZ1       |   86448 |  345 |       104 |     +6 |     1 |    14028 |      |       |     |          |                 |
  38. | -> 5 |      VIEW PUSHED PREDICATE          |            |       1 |  110 |       104 |     +6 | 14029 |    14028 |      |       |     |          |                 |
  39. | -> 6 |       FILTER                        |            |         |      |       104 |     +6 | 14029 |    14028 |      |       |     |          |                 |
  40. |    7 |        SORT AGGREGATE               |            |       1 |      |       104 |     +6 | 14029 |    14028 |      |       |     |     1.82 | Cpu (2)         |
  41. |    8 |         TABLE ACCESS BY INDEX ROWID | HTZ3       |    3716 |  110 |       109 |     +1 | 14029 |     470M |      |       |     |    69.09 | Cpu (76)        |
  42. | -> 9 |          INDEX RANGE SCAN           | IND_HTZ3_1 |    3759 |    9 |       105 |     +6 | 14029 |     480M |    2 | 49152 |     |    29.09 | Cpu (32)        |
  43. |   10 |    SORT JOIN                        |            |      80 |  347 |           |        |       |          |      |       |     |          |                 |
  44. |   11 |     TABLE ACCESS FULL               | HTZ2       |      80 |  346 |           |        |       |          |      |       |     |          |                 |
  45. ======================================================================================================================================================================
复制代码
这里可以看到SQL的表间接顺序走错了,我们希望的是a,b做HASH,结果集与D走NL的方式
  1. explain plan for">SELECT /*+ leading(a b d) SWAP_JOIN_INPUTS(a) no_swap_join_inputs(d) use_hash(a b d)  push_pred(d)*/
  2.   3        *
  3.   4    FROM scott.htz1 a,
  4.   5         scott.htz2 b,
  5.   6         (  SELECT COUNT (*) COUNT, owner
  6.   7              FROM scott.htz3 c
  7.   8             WHERE c.object_id > 1000
  8.   9          GROUP BY owner) d
  9. 10   WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
  10. Explained.
  11. Elapsed: 00:00:00.00
  12. www.htz.pw > @plan_by_explain.sql
  13. www.htz.pw > set lines 170
  14. www.htz.pw > set pages 1000
  15. www.htz.pw > select * from table(dbms_xplan.display);
  16. PLAN_TABLE_OUTPUT
  17. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  18. Plan hash value: 2320111649
  19. ------------------------------------------------------------------------------------------------------
  20. | Id  | Operation                       | Name       | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
  21. ------------------------------------------------------------------------------------------------------
  22. |   0 | SELECT STATEMENT                |            |    19M|  3953M|       |   268M  (1)|896:07:11 |
  23. |   1 |  NESTED LOOPS                   |            |    19M|  3953M|       |   268M  (1)|896:07:11 |
  24. |*  2 |   HASH JOIN                     |            |  2442K|   456M|  9288K|  1149   (1)| 00:00:14 |
  25. |   3 |    TABLE ACCESS FULL            | HTZ1       | 86448 |  8273K|       |   345   (1)| 00:00:05 |
  26. |*  4 |    TABLE ACCESS FULL            | HTZ2       |    80 |  7840 |       |   346   (1)| 00:00:05 |
  27. |   5 |   VIEW PUSHED PREDICATE         |            |     1 |    13 |       |   110   (0)| 00:00:02 |
  28. |*  6 |    FILTER                       |            |       |       |       |            |          |
  29. |   7 |     SORT AGGREGATE              |            |     1 |    11 |       |            |          |
  30. |*  8 |      TABLE ACCESS BY INDEX ROWID| HTZ3       |  3716 | 40876 |       |   110   (0)| 00:00:02 |
  31. |*  9 |       INDEX RANGE SCAN          | IND_HTZ3_1 |  3759 |       |       |     9   (0)| 00:00:01 |
  32. ------------------------------------------------------------------------------------------------------
  33. Predicate Information (identified by operation id):
  34. ---------------------------------------------------
  35.    2 - access("A"."OWNER"="B"."OWNER")
  36.    4 - filter("B"."CREATED">SYSDATE@!-1)
  37.    6 - filter(COUNT(*)>0)
  38.    8 - filter("C"."OBJECT_ID">1000)
  39.    9 - access("OWNER"="A"."OWNER")
  40. 25 rows selected.
  41. Elapsed: 00:00:00.01
  42. SELECT /*+ leading(a b d) SWAP_JOIN_INPUTS(a) no_swap_join_inputs(d) use_hash(a b d)  push_pred(d)*/
  43.       *
  44.   3    FROM scott.htz1 a,
  45.   4         scott.htz2 b,
  46.   5         (  SELECT COUNT (*) COUNT, owner
  47.   6              FROM scott.htz3 c
  48.   7             WHERE c.object_id > 1000
  49.   8          GROUP BY owner) d
  50.   9   WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
  51. 18 rows selected.
  52. Elapsed: 00:00:00.05
  53. Execution Plan
  54. ----------------------------------------------------------
  55. Plan hash value: 2320111649
  56. ------------------------------------------------------------------------------------------------------
  57. | Id  | Operation                       | Name       | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
  58. ------------------------------------------------------------------------------------------------------
  59. |   0 | SELECT STATEMENT                |            |    19M|  3953M|       |   268M  (1)|896:07:11 |
  60. |   1 |  NESTED LOOPS                   |            |    19M|  3953M|       |   268M  (1)|896:07:11 |
  61. |*  2 |   HASH JOIN                     |            |  2442K|   456M|  9288K|  1149   (1)| 00:00:14 |
  62. |   3 |    TABLE ACCESS FULL            | HTZ1       | 86448 |  8273K|       |   345   (1)| 00:00:05 |
  63. |*  4 |    TABLE ACCESS FULL            | HTZ2       |    80 |  7840 |       |   346   (1)| 00:00:05 |
  64. |   5 |   VIEW PUSHED PREDICATE         |            |     1 |    13 |       |   110   (0)| 00:00:02 |
  65. |*  6 |    FILTER                       |            |       |       |       |            |          |
  66. |   7 |     SORT AGGREGATE              |            |     1 |    11 |       |            |          |
  67. |*  8 |      TABLE ACCESS BY INDEX ROWID| HTZ3       |  3716 | 40876 |       |   110   (0)| 00:00:02 |
  68. |*  9 |       INDEX RANGE SCAN          | IND_HTZ3_1 |  3759 |       |       |     9   (0)| 00:00:01 |
  69. ------------------------------------------------------------------------------------------------------
  70. Predicate Information (identified by operation id):
  71. ---------------------------------------------------
  72.    2 - access("A"."OWNER"="B"."OWNER")
  73.    4 - filter("B"."CREATED">SYSDATE@!-1)
  74.    6 - filter(COUNT(*)>0)
  75.    8 - filter("C"."OBJECT_ID">1000)
  76.    9 - access("OWNER"="A"."OWNER")
  77. Statistics
  78. ----------------------------------------------------------
  79.           0  recursive calls
  80.           0  db block gets
  81.        2543  consistent gets
  82.           0  physical reads
  83.           0  redo size
  84.        4047  bytes sent via SQL*Net to client
  85.         534  bytes received via SQL*Net from client
  86.           3  SQL*Net roundtrips to/from client
  87.           0  sorts (memory)
  88.           0  sorts (disk)
  89.          18  rows processed
复制代码
这里看到逻辑读下降到2543,但是消耗了temspc空间,cost也是很多的。
其实VIEW中条件越多,创建组合索引效果会更好
  1. create index scott.ind_htz3_2 on scott.htz3(owner,object_id);">
  2. Index created.
  3. Elapsed: 00:00:00.10
  4. SELECT /*+ leading(a b d) SWAP_JOIN_INPUTS(a) no_swap_join_inputs(d) use_hash(a b d)  push_pred(d)*/
  5.   2        *
  6.   3    FROM scott.htz1 a,
  7.   4         scott.htz2 b,
  8.   5         (  SELECT COUNT (*) COUNT, owner
  9.   6              FROM scott.htz3 c
  10.   7             WHERE c.object_id > 1000
  11.   8          GROUP BY owner) d
  12.   9   WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
  13. 18 rows selected.
  14. Elapsed: 00:00:00.04
  15. Execution Plan
  16. ----------------------------------------------------------
  17. Plan hash value: 1875749008
  18. ----------------------------------------------------------------------------------------------
  19. | Id  | Operation               | Name       | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
  20. ----------------------------------------------------------------------------------------------
  21. |   0 | SELECT STATEMENT        |            |    19M|  3953M|       |    29M  (1)| 97:53:05 |
  22. |   1 |  NESTED LOOPS           |            |    19M|  3953M|       |    29M  (1)| 97:53:05 |
  23. |*  2 |   HASH JOIN             |            |  2442K|   456M|  9288K|  1149   (1)| 00:00:14 |
  24. |   3 |    TABLE ACCESS FULL    | HTZ1       | 86448 |  8273K|       |   345   (1)| 00:00:05 |
  25. |*  4 |    TABLE ACCESS FULL    | HTZ2       |    80 |  7840 |       |   346   (1)| 00:00:05 |
  26. |   5 |   VIEW PUSHED PREDICATE |            |     1 |    13 |       |    12   (0)| 00:00:01 |
  27. |*  6 |    FILTER               |            |       |       |       |            |          |
  28. |   7 |     SORT AGGREGATE      |            |     1 |    11 |       |            |          |
  29. |*  8 |      INDEX RANGE SCAN   | IND_HTZ3_2 |  3716 | 40876 |       |    12   (0)| 00:00:01 |
  30. ----------------------------------------------------------------------------------------------
  31. Predicate Information (identified by operation id):
  32. ---------------------------------------------------
  33.    2 - access("A"."OWNER"="B"."OWNER")
  34.    4 - filter("B"."CREATED">SYSDATE@!-1)
  35.    6 - filter(COUNT(*)>0)
  36.    8 - access("OWNER"="A"."OWNER" AND "C"."OBJECT_ID">1000 AND "C"."OBJECT_ID" IS NOT
  37.               NULL)
  38. Statistics
  39. ----------------------------------------------------------
  40.           0  recursive calls
  41.           0  db block gets
  42.        2489  consistent gets  这里减少了54个BLOCK基本就是一下回表的操作
  43.           0  physical reads
  44.           0  redo size
  45.        4047  bytes sent via SQL*Net to client
  46.         534  bytes received via SQL*Net from client
  47.           3  SQL*Net roundtrips to/from client
  48.           0  sorts (memory)
  49.           0  sorts (disk)
  50.          18  rows processed
复制代码
6,禁用推入
  1. alter system set "_optimizer_extend_jppd_view_types"=false;">
  2. System altered.
  3. Elapsed: 00:00:00.01
复制代码
禁用_optimizer_extend_jppd_view_types参数,这里可以看到走HASH,消耗大量TEMPSPC
  1.           *
  2.   3        FROM scott.htz1 a,
  3.   4             scott.htz2 b,
  4.   5             (  SELECT COUNT (*) COUNT, owner
  5.   6                  FROM scott.htz3 c
  6.   7                 WHERE c.object_id > 1000
  7.   8              GROUP BY owner) d
  8.   9       WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
  9. 18 rows selected.
  10. Elapsed: 00:00:00.06
  11. Execution Plan
  12. ----------------------------------------------------------
  13. Plan hash value: 2571011931
  14. ----------------------------------------------------------------------------------------------
  15. | Id  | Operation               | Name       | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
  16. ----------------------------------------------------------------------------------------------
  17. |   0 | SELECT STATEMENT        |            |    19M|  4274M|       | 25302   (1)| 00:05:04 |
  18. |*  1 |  HASH JOIN              |            |    19M|  4274M|   484M| 25302   (1)| 00:05:04 |
  19. |*  2 |   HASH JOIN             |            |  2442K|   456M|  9288K|  1149   (1)| 00:00:14 |
  20. |   3 |    TABLE ACCESS FULL    | HTZ1       | 86448 |  8273K|       |   345   (1)| 00:00:05 |
  21. |*  4 |    TABLE ACCESS FULL    | HTZ2       |    80 |  7840 |       |   346   (1)| 00:00:05 |
  22. |   5 |   VIEW                  |            |    23 |   690 |       |    75   (4)| 00:00:01 |
  23. |   6 |    HASH GROUP BY        |            |    23 |   253 |       |    75   (4)| 00:00:01 |
  24. |*  7 |     INDEX FAST FULL SCAN| IND_HTZ3_2 | 85470 |   918K|       |    72   (0)| 00:00:01 |
  25. ----------------------------------------------------------------------------------------------
  26. Predicate Information (identified by operation id):
  27. ---------------------------------------------------
  28.    1 - access("A"."OWNER"="D"."OWNER")
  29.    2 - access("A"."OWNER"="B"."OWNER")
  30.    4 - filter("B"."CREATED">SYSDATE@!-1)
  31.    7 - filter("C"."OBJECT_ID">1000)
  32. Statistics
  33. ----------------------------------------------------------
  34.           1  recursive calls
  35.           0  db block gets
  36.        2746  consistent gets
  37.           0  physical reads
  38.           0  redo size
  39.        4080  bytes sent via SQL*Net to client
  40.         534  bytes received via SQL*Net from client
  41.           3  SQL*Net roundtrips to/from client
  42.           0  sorts (memory)
  43.           0  sorts (disk)
  44.          18  rows processed
复制代码
测试结束
MOS中已经有很多文档对连接列谓词推入做了详细说明
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册