我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!

由于博客中有大量代码,通过页面浏览效果更佳。

前面几天发了几篇JPPD文章,今天就来演示一下客户现场遇到真实案例的模拟,这个在客户现场优化SQL时遇到连接谓词推入不成功的案例,由于但是客户正式环境不允许操作,有没有测试环境,没有办法测试,下面是在自己的虚拟机里面演示一下,优化后能带来的性能提升。

1,环境介绍

本次实验是基于11.2.0.4环境,其它环境在默认情况下可能结果会不一致。

www.htz.pw > select * from v$version where rownum<4;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production www.htz.pw > !lsb_release -a
Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 8)

2,参数配置

下面参数都为默认情况下的配置

  2         b.ksppstvl AS session_value,
3 c.ksppstvl AS instance_value,
4 a.ksppdesc AS description
5 FROM x$ksppi a,
6 x$ksppcv b,
7 x$ksppsv c
8 WHERE a.indx = b.indx
9 AND a.indx = c.indx
10 AND a.ksppinm LIKE '/_%' ESCAPE '/'
11 AND (a.ksppinm in ('_push_join_predicate','_optimizer_push_pred_cost_based','_optimizer_extend_jppd_view_types'))
12 ORDER BY a.ksppinm
13 / PARAMETER S_VALUE D_VALUE DESCRIPTION
----------------------------------- ------- -------- ----------------------------------------------------------------
_optimizer_extend_jppd_view_types TRUE TRUE join pred pushdown on group-by, distinct, semi-/anti-joined view
_optimizer_push_pred_cost_based TRUE TRUE use cost-based query transformation for push pred optimization
_push_join_predicate TRUE TRUE enable pushing join predicate inside a view

3,创建测试表

这里都是基于dba_objects视图创建的。

www.htz.pw > create table scott.htz1 as select * from dba_objects;
www.htz.pw > create table scott.htz2 as select * from dba_objects;
www.htz.pw > create table scott.htz3 as select * from dba_objects;

4,语句一测试

下面这个SQL还回是0行,其实出view,SQL本来也就是还回0行,这个还回的行数直接影响到我们的测试结果。

    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 a.object_id > b.object_id
AND b.CREATED > SYSDATE - 1
AND a.owner = d.owner;

4.1 默认情况

    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 a.object_id > b.object_id
AND b.CREATED > SYSDATE - 1
AND a.owner = d.owner; no rows selected Execution 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 强制连接列谓词推入

  2        *
3 FROM scott.htz1 a,
4 scott.htz2 b,
5 ( SELECT COUNT (*) COUNT, owner
6 FROM scott.htz3 c
7 WHERE c.object_id > 1000
8 GROUP BY owner) d
9 WHERE a.owner = b.owner
10 AND a.object_id > b.object_id
11 AND b.CREATED > SYSDATE - 1
12 AND a.owner = d.owner; no rows selected Execution Plan
----------------------------------------------------------
Plan hash value: 1009835727 --------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 42M| 16G| 1990K (1)| 06:38:11 |
| 1 | NESTED LOOPS | | 42M| 16G| 1990K (1)| 06:38:11 |
|* 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 PUSHED PREDICATE | | 1 | 13 | 345 (1)| 00:00:05 |
|* 6 | FILTER | | | | | |
| 7 | SORT AGGREGATE | | 1 | 30 | | |
|* 8 | TABLE ACCESS FULL | HTZ3 | 881 | 26430 | 345 (1)| 00:00:05 |
-------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OWNER"="B"."OWNER")
filter("A"."OBJECT_ID">"B"."OBJECT_ID")
3 - filter("B"."CREATED">SYSDATE@!-1)
6 - filter(COUNT(*)>0)
8 - filter("OWNER"="A"."OWNER" AND "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

这里消耗的逻辑读也是2480,但是tempspc为0.但是这里ORACLE自己估算出来谓词推入成本更高。

4.3 连接列创建索引

  2        *
3 FROM scott.htz1 a,
4 scott.htz2 b,
5 ( SELECT COUNT (*) COUNT, owner
6 FROM scott.htz3 c
7 WHERE c.object_id > 1000
8 GROUP BY owner) d
9 WHERE a.owner = b.owner
10 AND a.object_id > b.object_id
11 AND b.CREATED > SYSDATE - 1
12 AND a.owner = d.owner; no rows selected Execution Plan
----------------------------------------------------------
Plan hash value: 3435586372 ----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 42M| 16G| 104K (1)| 00:20:56 |
| 1 | NESTED LOOPS | | 42M| 16G| 104K (1)| 00:20:56 |
|* 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 PUSHED PREDICATE | | 1 | 13 | 18 (0)| 00:00:01 |
|* 6 | FILTER | | | | | |
| 7 | SORT AGGREGATE | | 1 | 30 | | |
|* 8 | TABLE ACCESS BY INDEX ROWID| HTZ3 | 881 | 26430 | 18 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | IND_HTZ3_1 | 352 | | 8 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OWNER"="B"."OWNER")
filter("A"."OBJECT_ID">"B"."OBJECT_ID")
3 - filter("B"."CREATED">SYSDATE@!-1)
6 - filter(COUNT(*)>0)
8 - filter("C"."OBJECT_ID">1000)
9 - access("OWNER"="A"."OWNER") 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

这里可以看到,逻辑读变,但是ORACLE的估算成本在这里下将了。

4.4 总结

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

5,语句二测试

下面这个SQL是有结果集还回的

   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 > SYSDATE - 1 AND a.owner = d.owner; 18 rows selected.

可以看到还回了18行记录

5.1 默认情况

   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 > SYSDATE - 1 AND a.owner = d.owner; 18 rows selected. Elapsed: 00:00:00.05 Execution 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 强制谓词推入

  2        *
3 FROM scott.htz1 a,
4 scott.htz2 b,
5 ( SELECT COUNT (*) COUNT, owner
6 FROM scott.htz3 c
7 WHERE c.object_id > 1000
8 GROUP BY owner) d
9 WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner;
FROM scott.htz1 a,
*
ERROR at line 3:
ORA-01013: user requested cancel of current operation Elapsed: 00:05:19.68

运行很久没有结果

Enter value for sqlid: fkkvkv27pgqbx
SQL Monitoring Report SQL Text
------------------------------
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
E - 1 AND a.owner = d.owner Global Information
------------------------------
Status : EXECUTING
Instance ID : 1
Session : SYS (26:7)
SQL ID : fkkvkv27pgqbx
SQL Execution ID : 16777218
Execution Started : 04/20/2015 22:06:30
First Refresh Time : 04/20/2015 22:06:36
Last Refresh Time : 04/20/2015 22:08:19
Duration : 110s
Module/Action : sqlplus@orcl9i (TNS V1-V3)/-
Service : SYS$USERS
Program : sqlplus@orcl9i (TNS V1-V3) Global Stats
===================================================================
| Elapsed | Cpu | IO | Other | Buffer | Read | Read |
| Time(s) | Time(s) | Waits(s) | Waits(s) | Gets | Reqs | Bytes |
===================================================================
| 108 | 108 | 0.00 | 0.51 | 14M | 2 | 49152 |
=================================================================== SQL Plan Monitoring Details (Plan Hash Value=258155078)
======================================================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Read | Read | Mem | Activity | Activity Detail |
| | | | (Estim) | | Active(s) | Active | | (Actual) | Reqs | Bytes | | (%) | (# samples) |
======================================================================================================================================================================
| 0 | SELECT STATEMENT | | | | | | 1 | | | | | | |
| 1 | MERGE JOIN | | 20M | 10M | | | 1 | | | | | | |
| -> 2 | SORT JOIN | | 702K | 10M | 104 | +6 | 1 | 0 | | | 2M | | |
| -> 3 | NESTED LOOPS | | 702K | 10M | 104 | +6 | 1 | 14028 | | | | | |
| -> 4 | TABLE ACCESS FULL | HTZ1 | 86448 | 345 | 104 | +6 | 1 | 14028 | | | | | |
| -> 5 | VIEW PUSHED PREDICATE | | 1 | 110 | 104 | +6 | 14029 | 14028 | | | | | |
| -> 6 | FILTER | | | | 104 | +6 | 14029 | 14028 | | | | | |
| 7 | SORT AGGREGATE | | 1 | | 104 | +6 | 14029 | 14028 | | | | 1.82 | Cpu (2) |
| 8 | TABLE ACCESS BY INDEX ROWID | HTZ3 | 3716 | 110 | 109 | +1 | 14029 | 470M | | | | 69.09 | Cpu (76) |
| -> 9 | INDEX RANGE SCAN | IND_HTZ3_1 | 3759 | 9 | 105 | +6 | 14029 | 480M | 2 | 49152 | | 29.09 | Cpu (32) |
| 10 | SORT JOIN | | 80 | 347 | | | | | | | | | |
| 11 | TABLE ACCESS FULL | HTZ2 | 80 | 346 | | | | | | | | | |
======================================================================================================================================================================

这里可以看到SQL的表间接顺序走错了,我们希望的是a,b做HASH,结果集与D走NL的方式

SELECT /*+ leading(a b d) SWAP_JOIN_INPUTS(a) no_swap_join_inputs(d) use_hash(a b d)  push_pred(d)*/
3 *
4 FROM scott.htz1 a,
5 scott.htz2 b,
6 ( SELECT COUNT (*) COUNT, owner
7 FROM scott.htz3 c
8 WHERE c.object_id > 1000
9 GROUP BY owner) d
10 WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner; Explained. Elapsed: 00:00:00.00
www.htz.pw > @plan_by_explain.sql
www.htz.pw > set lines 170
www.htz.pw > set pages 1000
www.htz.pw > select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2320111649 ------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19M| 3953M| | 268M (1)|896:07:11 |
| 1 | NESTED LOOPS | | 19M| 3953M| | 268M (1)|896:07:11 |
|* 2 | HASH JOIN | | 2442K| 456M| 9288K| 1149 (1)| 00:00:14 |
| 3 | TABLE ACCESS FULL | HTZ1 | 86448 | 8273K| | 345 (1)| 00:00:05 |
|* 4 | TABLE ACCESS FULL | HTZ2 | 80 | 7840 | | 346 (1)| 00:00:05 |
| 5 | VIEW PUSHED PREDICATE | | 1 | 13 | | 110 (0)| 00:00:02 |
|* 6 | FILTER | | | | | | |
| 7 | SORT AGGREGATE | | 1 | 11 | | | |
|* 8 | TABLE ACCESS BY INDEX ROWID| HTZ3 | 3716 | 40876 | | 110 (0)| 00:00:02 |
|* 9 | INDEX RANGE SCAN | IND_HTZ3_1 | 3759 | | | 9 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OWNER"="B"."OWNER")
4 - filter("B"."CREATED">SYSDATE@!-1)
6 - filter(COUNT(*)>0)
8 - filter("C"."OBJECT_ID">1000)
9 - access("OWNER"="A"."OWNER") 25 rows selected. Elapsed: 00:00:00.01 SELECT /*+ leading(a b d) SWAP_JOIN_INPUTS(a) no_swap_join_inputs(d) use_hash(a b d) push_pred(d)*/
*
3 FROM scott.htz1 a,
4 scott.htz2 b,
5 ( SELECT COUNT (*) COUNT, owner
6 FROM scott.htz3 c
7 WHERE c.object_id > 1000
8 GROUP BY owner) d
9 WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner; 18 rows selected. Elapsed: 00:00:00.05 Execution Plan
----------------------------------------------------------
Plan hash value: 2320111649 ------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19M| 3953M| | 268M (1)|896:07:11 |
| 1 | NESTED LOOPS | | 19M| 3953M| | 268M (1)|896:07:11 |
|* 2 | HASH JOIN | | 2442K| 456M| 9288K| 1149 (1)| 00:00:14 |
| 3 | TABLE ACCESS FULL | HTZ1 | 86448 | 8273K| | 345 (1)| 00:00:05 |
|* 4 | TABLE ACCESS FULL | HTZ2 | 80 | 7840 | | 346 (1)| 00:00:05 |
| 5 | VIEW PUSHED PREDICATE | | 1 | 13 | | 110 (0)| 00:00:02 |
|* 6 | FILTER | | | | | | |
| 7 | SORT AGGREGATE | | 1 | 11 | | | |
|* 8 | TABLE ACCESS BY INDEX ROWID| HTZ3 | 3716 | 40876 | | 110 (0)| 00:00:02 |
|* 9 | INDEX RANGE SCAN | IND_HTZ3_1 | 3759 | | | 9 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OWNER"="B"."OWNER")
4 - filter("B"."CREATED">SYSDATE@!-1)
6 - filter(COUNT(*)>0)
8 - filter("C"."OBJECT_ID">1000)
9 - access("OWNER"="A"."OWNER") Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2543 consistent gets
0 physical reads
0 redo size
4047 bytes sent via SQL*Net to client
534 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
18 rows processed

这里看到逻辑读下降到2543,但是消耗了temspc空间,cost也是很多的。

其实VIEW中条件越多,创建组合索引效果会更好


Index created. Elapsed: 00:00:00.10 SELECT /*+ leading(a b d) SWAP_JOIN_INPUTS(a) no_swap_join_inputs(d) use_hash(a b d) push_pred(d)*/
2 *
3 FROM scott.htz1 a,
4 scott.htz2 b,
5 ( SELECT COUNT (*) COUNT, owner
6 FROM scott.htz3 c
7 WHERE c.object_id > 1000
8 GROUP BY owner) d
9 WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner; 18 rows selected. Elapsed: 00:00:00.04 Execution Plan
----------------------------------------------------------
Plan hash value: 1875749008 ----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19M| 3953M| | 29M (1)| 97:53:05 |
| 1 | NESTED LOOPS | | 19M| 3953M| | 29M (1)| 97:53:05 |
|* 2 | HASH JOIN | | 2442K| 456M| 9288K| 1149 (1)| 00:00:14 |
| 3 | TABLE ACCESS FULL | HTZ1 | 86448 | 8273K| | 345 (1)| 00:00:05 |
|* 4 | TABLE ACCESS FULL | HTZ2 | 80 | 7840 | | 346 (1)| 00:00:05 |
| 5 | VIEW PUSHED PREDICATE | | 1 | 13 | | 12 (0)| 00:00:01 |
|* 6 | FILTER | | | | | | |
| 7 | SORT AGGREGATE | | 1 | 11 | | | |
|* 8 | INDEX RANGE SCAN | IND_HTZ3_2 | 3716 | 40876 | | 12 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OWNER"="B"."OWNER")
4 - filter("B"."CREATED">SYSDATE@!-1)
6 - filter(COUNT(*)>0)
8 - access("OWNER"="A"."OWNER" AND "C"."OBJECT_ID">1000 AND "C"."OBJECT_ID" IS NOT
NULL) Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2489 consistent gets 这里减少了54个BLOCK基本就是一下回表的操作
0 physical reads
0 redo size
4047 bytes sent via SQL*Net to client
534 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
18 rows processed

6,禁用推入


System altered. Elapsed: 00:00:00.01

禁用_optimizer_extend_jppd_view_types参数,这里可以看到走HASH,消耗大量TEMPSPC

          *
3 FROM scott.htz1 a,
4 scott.htz2 b,
5 ( SELECT COUNT (*) COUNT, owner
6 FROM scott.htz3 c
7 WHERE c.object_id > 1000
8 GROUP BY owner) d
9 WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner; 18 rows selected. Elapsed: 00:00:00.06 Execution Plan
----------------------------------------------------------
Plan hash value: 2571011931 ----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19M| 4274M| | 25302 (1)| 00:05:04 |
|* 1 | HASH JOIN | | 19M| 4274M| 484M| 25302 (1)| 00:05:04 |
|* 2 | HASH JOIN | | 2442K| 456M| 9288K| 1149 (1)| 00:00:14 |
| 3 | TABLE ACCESS FULL | HTZ1 | 86448 | 8273K| | 345 (1)| 00:00:05 |
|* 4 | TABLE ACCESS FULL | HTZ2 | 80 | 7840 | | 346 (1)| 00:00:05 |
| 5 | VIEW | | 23 | 690 | | 75 (4)| 00:00:01 |
| 6 | HASH GROUP BY | | 23 | 253 | | 75 (4)| 00:00:01 |
|* 7 | INDEX FAST FULL SCAN| IND_HTZ3_2 | 85470 | 918K| | 72 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - access("A"."OWNER"="D"."OWNER")
2 - access("A"."OWNER"="B"."OWNER")
4 - filter("B"."CREATED">SYSDATE@!-1)
7 - filter("C"."OBJECT_ID">1000) Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2746 consistent gets
0 physical reads
0 redo size
4080 bytes sent via SQL*Net to client
534 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
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)


性能调优:JPPD(连接谓词下推)客户案例模拟的更多相关文章

  1. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写

    摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...

  2. Java 应用性能调优实践

    Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具和思路,给出搜狗商业平台的性 ...

  3. linux概念之性能调优

    目前,对系统进行性能调试的工具有很多,这些可以两大类:一类是标准的分析工具,即所有的UNIX都会带的分析工具: 另一类是不同厂商的UNIX所特有的性能分析工具,比如HP-UX就有自己的增值性能分析工具 ...

  4. linux性能调优概述

    - 什么是性能调优?(what) - 为什么需要性能调优?(why) - 什么时候需要性能调优?(when) - 什么地方需要性能调优?(where) - 什么人来进行性能调优?(who) - 怎么样 ...

  5. mysql监控、性能调优及三范式理解

    原文:mysql监控.性能调优及三范式理解 1监控 工具:sp on mysql     sp系列可监控各种数据库 2调优 2.1 DB层操作与调优 2.1.1.开启慢查询 在My.cnf文件中添加如 ...

  6. 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧

    性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对 ...

  7. 性能调优之MYSQL高并发优化

    性能调优之MYSQL高并发优化   一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之 ...

  8. Informatica_(6)性能调优

    六.实战汇总31.powercenter 字符集 了解源或者目标数据库的字符集,并在Powercenter服务器上设置相关的环境变量或者完成相关的设置,不同的数据库有不同的设置方法: 多数字符集的问题 ...

  9. MySql(十):MySQL性能调优——MySQL Server性能优化

    本章主要通过针对MySQL Server( mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优 ...

  10. MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控

    第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一 ...

随机推荐

  1. Django实战项目-学习任务系统-用户登录

    第一步:先创建一个Django应用程序框架代码 1,先创建一个Django项目 django-admin startproject mysite 将创建一个目录,其布局如下: mysite/ mana ...

  2. SetupFactory-脚本

    1.写注册表 lResult = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, "SOFTWARE\\MapInfo\\MapX\\5.0") ...

  3. Nginx 301永久性转移

    我有个域名www.taadis.com, 想永久性转移到taadis.com. 前言 看到很多网友的做法是把taadis.com & www.taadis.com等多个域名放到一个server ...

  4. 学习unigui【19】unidbgrid的Group By This Field汉化

    上面已经将group by this field 汉化. 由于版本的不断更新,不可避免有汉化遗漏.那么说到 如何汉化问题. 根据ExtJSVersion查找你电脑响应目录文件D:\Program Fi ...

  5. 收藏破10w的教程!用DeepSeek做可视化:5个案例搞定工作汇报/论文/自媒体,一键生成(保姆级喂饭,附全套模板)

    大家好,我是狂师. DeepSeek作为今年爆火的AI工具,已经被广泛用于各种办公或自媒体写作创作场景,比如可以用DeepSeek辅助帮我们生成各种代码,如Python.Java.SQL.JavaSc ...

  6. grequests,并发执行接口请求的方法(简易版)

    有时候需要处理很多请求,显然,一个一个去处理是要花费很多时间的 我们就需要用到并发的方式,python并发请求的方法很多,从简单到复杂. 本案例,介绍一个超级简单,使用grequests库,实现并发请 ...

  7. jmeter从文档CSV内读取参数且文件路径为相对路径

    如下图,"全站链接扫描"脚本的参数化文件存储在同一目录的参数化文件夹内 预计实现读取该文件使用相对路径(非绝对路径,避免脚本在另一台电脑存在别的目录下能正常读取参数文件) 如读取& ...

  8. 被LangChain4j坑惨了!

    最近在深度体验和使用 Spring AI 和 LangChain4j,从开始的满怀期待五五开,但最后极具痛苦的使用 LangChain4j,让我真正体验到了正规军和草台班子的区别. Spring AI ...

  9. 【HUST】网安|计算机网络|计算机网络自顶向下方法(原书第7版)第三章部分习题答案

    参考:英文版的原答案. 答案放gitee了,自取. 3-P18. 3.4.4 节我们学习的一般性 SR 协议中,只要报文可用(如果报文在窗口中) ,发送方就会不等待确认而传输报文.假设现在我们要求一个 ...

  10. 【经验】WakeUp、Outlook、Google日历导入飞书日历

    以飞书团队账号登录时,设置的日历就能被团队其他成员看到(可选择私密.仅忙碌[默认].完全公开三种模式),以便相互查看空闲时间. Wakeup日历导出到Outlook日历 Wakeup支持从各大学校便利 ...