oracle swap_join_inputs,【学习笔记】如何使用SWAP_JOIN_INPUTS修改HASH连接的驱动表

【学习笔记】如何使用SWAP_JOIN_INPUTS修改HASH连接的驱动表

时间:2016-11-03 21:25   来源:Oracle研究中心   作者:HTZ   点击:

天萃荷净

Oracle研究中心学习笔记:分享一篇关于修改HASH连接的驱动表笔记,通过如何使用SWAP_JOIN_INPUTS修改HASH连接的驱动表详细过程笔记。

下面是测试在HASH连接的时候,修改驱动表的顺序。HASH连接不能用于不等值连接。

1 环境介绍

oracleplus.net> select * from v$version;

BANNER

——————————————————————————–

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production

PL/SQL Release 11.2.0.3.0 – Production

CORE 11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 – Production

NLSRTL Version 11.2.0.3.0 – Production

oracleplus.net> !uname -a

Linux orcl9i 2.6.9-89.EL #1 Mon Apr 20 10:22:29 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

2 创建测试表

oracleplus.net> create table htz.htz1 as select * from dba_objects;

Table created.

oracleplus.net> create table htz.htz2 as select * from dba_objects;

Table created.

oracleplus.net> create table htz.htz3 as select * from dba_objects;

Table created.

3 原SQL语句执行计划

oracleplus.net> select /*+ huang*/count(*)

2 from htz.htz1 a, htz.htz2 b, htz.htz3 c

3 where a.object_id = b.object_id

4 and a.object_id = c.object_id;

COUNT(*)

———-

74656

oracleplus.net> @find_sql

Enter value for sql_text: huang

Enter value for sql_id:

SQL_ID Oracle о CHILD HASH_VALUE PLAN_HASH EXECS ETIME AVG_ETIME USERNAME

————- —— ———- ———- ———- ————- ————- ————-

SQLTEXT

——————————————————————————————

7uyt5873uq4av 0 3349877083 283048524 1 .09 .09 SYS

select /*+ huang*/count(*) from htz.htz1 a, htz.htz2 b, htz.htz3 c where a.object_id = b.object_id and a.object_id = c.object_id

oracleplus.net> set lines 200

oracleplus.net> select * from table(dbms_xplan.display_cursor(‘7uyt5873uq4av’,null,’advanced’));

PLAN_TABLE_OUTPUT

——————————————————————————————

SQL_ID 7uyt5873uq4av, child number 0

————————————-

select /*+ huang*/count(*) from htz.htz1 a, htz.htz2 b, htz.htz3 c

where a.object_id = b.object_id and a.object_id = c.object_id

Plan hash value: 283048524

————————————————————————————-

| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

————————————————————————————-

| 0 | SELECT STATEMENT | | | | | 1242 (100)| |

| 1 | SORT AGGREGATE | | 1 | 39 | | | |

|* 2 | HASH JOIN | | 61296 | 2334K| 1704K| 1242 (1)| 00:00:15 |

| 3 | TABLE ACCESS FULL | HTZ3 | 69661 | 884K| | 298 (1)| 00:00:04 |

|* 4 | HASH JOIN | | 61296 | 1556K| 1504K| 750 (1)| 00:00:09 |

| 5 | TABLE ACCESS FULL| HTZ1 | 61295 | 778K| | 298 (1)| 00:00:04 |

| 6 | TABLE ACCESS FULL| HTZ2 | 66602 | 845K| | 298 (1)| 00:00:04 |

————————————————————————————-

Query Block Name / Object Alias (identified by operation id):

————————————————————-

1 – SEL$1

3 – SEL$1 / C@SEL$1

5 – SEL$1 / A@SEL$1

6 – SEL$1 / B@SEL$1

Outline Data

————-

/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE(‘11.2.0.3’)

DB_VERSION(‘11.2.0.3’)

OPT_PARAM(‘_b_tree_bitmap_plans’ ‘false’)

OPT_PARAM(‘_optimizer_use_feedback’ ‘false’)

ALL_ROWS

OUTLINE_LEAF(@”SEL$1″)

FULL(@”SEL$1″ “A”@”SEL$1”)

FULL(@”SEL$1″ “B”@”SEL$1”)

FULL(@”SEL$1″ “C”@”SEL$1”)

LEADING(@”SEL$1″ “A”@”SEL$1” “B”@”SEL$1” “C”@”SEL$1”)

USE_HASH(@”SEL$1″ “B”@”SEL$1”)

USE_HASH(@”SEL$1″ “C”@”SEL$1”)

SWAP_JOIN_INPUTS(@”SEL$1″ “C”@”SEL$1”)

END_OUTLINE_DATA

*/

4 SWAP_JOIN_INPUTS更改驱动表

手动指定表的访问顺序为A,B,C,A为驱动表,AB的结果集再去驱动C

oracleplus.net> alter system flush shared_pool;

System altered.

这里直接COPY Outline Data中的提示信息来修改就可以了。

select /*+ LEADING(@”SEL$1″ “A”@”SEL$1” “B”@”SEL$1” “C”@”SEL$1″) SWAP_JOIN_INPUTS(@”SEL$1” “A”@”SEL$1″) NO_SWAP_JOIN_INPUTS(@”SEL$1” “C”@”SEL$1”) */

count(*)

from htz.htz1 a, htz.htz2 b, htz.htz3 c

where a.object_id = b.object_id

5 and a.object_id = c.object_id;

COUNT(*)

———-

74656

oracleplus.net> @find_sql.sql

Enter value for sql_text: LEADING

Enter value for sql_id:

SQL_ID CHILD HASH_VALUE PLAN_HASH EXECS ETIME AVG_ETIME USERNAME

————- —— ———- ———- ———- ————- ————- ————-

SQLTEXT

———————————————————————————————–

87cu5q9nkqgzk 0 1764442098 274524172 1 .09 .09 SYS

select /*+ LEADING(@”SEL$1″ “A”@”SEL$1” “B”@”SEL$1” “C”@”SEL$1″) SWAP_JOIN_INPUTS(@”SEL$1” “A”@”SEL$1″) NO_SWAP_JOIN_INPUTS(@”SEL$1” “C”@”SEL$1”) */ count(*) from htz.htz1 a, htz.htz2 b,

htz.htz3 c where a.object_id = b.object_id and a.object_id = c.object_id

oracleplus.net> select * from table(dbms_xplan.display_cursor(’87cu5q9nkqgzk’,null,’advanced’));

PLAN_TABLE_OUTPUT

———————————————————————————————–

SQL_ID 87cu5q9nkqgzk, child number 0

————————————-

select /*+ LEADING(@”SEL$1″ “A”@”SEL$1” “B”@”SEL$1” “C”@”SEL$1”)

SWAP_JOIN_INPUTS(@”SEL$1″ “A”@”SEL$1″) NO_SWAP_JOIN_INPUTS(@”SEL$1”

“C”@”SEL$1”) */ count(*) from htz.htz1 a, htz.htz2 b, htz.htz3 c

where a.object_id = b.object_id and a.object_id = c.object_id

Plan hash value: 274524172

————————————————————————————-

| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

————————————————————————————-

| 0 | SELECT STATEMENT | | | | | 1242 (100)| |

| 1 | SORT AGGREGATE | | 1 | 39 | | | |

|* 2 | HASH JOIN | | 61296 | 2334K| 2280K| 1242 (1)| 00:00:15 |

|* 3 | HASH JOIN | | 61296 | 1556K| 1504K| 750 (1)| 00:00:09 |

| 4 | TABLE ACCESS FULL| HTZ1 | 61295 | 778K| | 298 (1)| 00:00:04 |

| 5 | TABLE ACCESS FULL| HTZ2 | 66602 | 845K| | 298 (1)| 00:00:04 |

| 6 | TABLE ACCESS FULL | HTZ3 | 69661 | 884K| | 298 (1)| 00:00:04 |

————————————————————————————-

Query Block Name / Object Alias (identified by operation id):

————————————————————-

1 – SEL$1

4 – SEL$1 / A@SEL$1

5 – SEL$1 / B@SEL$1

6 – SEL$1 / C@SEL$1

Outline Data

————-

/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE(‘11.2.0.3’)

DB_VERSION(‘11.2.0.3’)

OPT_PARAM(‘_b_tree_bitmap_plans’ ‘false’)

OPT_PARAM(‘_optimizer_use_feedback’ ‘false’)

ALL_ROWS

OUTLINE_LEAF(@”SEL$1″)

FULL(@”SEL$1″ “A”@”SEL$1”)

FULL(@”SEL$1″ “B”@”SEL$1”)

FULL(@”SEL$1″ “C”@”SEL$1”)

LEADING(@”SEL$1″ “A”@”SEL$1” “B”@”SEL$1” “C”@”SEL$1”)

USE_HASH(@”SEL$1″ “B”@”SEL$1”)

USE_HASH(@”SEL$1″ “C”@”SEL$1”)

END_OUTLINE_DATA

*/

Predicate Information (identified by operation id):

—————————————————

2 – access(“A”.”OBJECT_ID”=”C”.”OBJECT_ID”)

3 – access(“A”.”OBJECT_ID”=”B”.”OBJECT_ID”)

Column Projection Information (identified by operation id):

———————————————————–

1 – (#keys=0) COUNT(*)[22]

2 – (#keys=1)

3 – (#keys=1) “A”.”OBJECT_ID”[NUMBER,22]

4 – “A”.”OBJECT_ID”[NUMBER,22]

5 – “B”.”OBJECT_ID”[NUMBER,22]

6 – “C”.”OBJECT_ID”[NUMBER,22]

如果提示没有生效,请注意_optimizer_ignore_hints参数是否配置成TRUE。如果配置成true,那么SQL中的所有提示都将被忽略。

本文固定链接: http://www.htz.pw/2014/11/09/swap_join_inputs-%e4%bf%ae%e6%94%b9hash%e8%bf%9e%e6%8e%a5%e7%9a%84%e9%a9%b1%e5%8a%a8%e8%a1%a8.html | 认真就输

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】如何使用SWAP_JOIN_INPUTS修改HASH连接的驱动表

9bd101509341196819122f36086c9a60.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值