|
原帖由 Yong Huang 于 2009-1-7 02:25 发表 ![]()
Doesn't sound right. Can you show us a test case? And remember to tell us version.
Yong Huang
SQL>
SQL>
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
SQL> create table t1 as select * from dba_objects where rownum<10001;
表已创建。
SQL> create table t2 as select * from dba_objects where rownum<1001;
表已创建。
SQL> create table t3 as select * from dba_objects where rownum<101;
表已创建。
SQL> explain plan for
2 select * from t1,t2,t3 where t1.object_id=t2.object_id and t1.owner=t3.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1487401159
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100K| 50M| 29 (7)| 00:00:01 |
|* 1 | HASH JOIN | | 100K| 50M| 29 (7)| 00:00:01 |
| 2 | TABLE ACCESS FULL | T3 | 100 | 17700 | 4 (0)| 00:00:01 |
|* 3 | HASH JOIN | | 1000 | 345K| 24 (5)| 00:00:01 |
| 4 | TABLE ACCESS FULL| T2 | 1000 | 172K| 5 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T3"."OWNER")
3 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
Note
-----
- dynamic sampling used for this statement
已选择22行。
SQL> explain plan for
2 select/*+no_swap_join_inputs(t3)*/ * from t1,t2,t3 where t1.object_id=t2.object_id and t1.owner=t3.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1184213596
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100K| 50M| 29 (7)| 00:00:01 |
|* 1 | HASH JOIN | | 100K| 50M| 29 (7)| 00:00:01 |
|* 2 | HASH JOIN | | 1000 | 345K| 24 (5)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T2 | 1000 | 172K| 5 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | T3 | 100 | 17700 | 4 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T3"."OWNER")
2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
Note
-----
- dynamic sampling used for this statement
已选择22行。
SQL> explain plan for
2 select * from t1,t2,t3 where t1.object_id=t3.object_id and t1.owner=t2.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2467348796
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 33333 | 16M| 29 (7)| 00:00:01 |
|* 1 | HASH JOIN | | 33333 | 16M| 29 (7)| 00:00:01 |
|* 2 | HASH JOIN | | 100 | 35400 | 23 (5)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T3 | 100 | 17700 | 4 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | T2 | 1000 | 172K| 5 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T2"."OWNER")
2 - access("T1"."OBJECT_ID"="T3"."OBJECT_ID")
Note
-----
- dynamic sampling used for this statement
已选择22行。
SQL> explain plan for
2 select/*+swap_join_inputs(t2)*/ * from t1,t2,t3 where t1.object_id=t3.object_id and t1.owner=t2.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3835162943
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 33333 | 16M| 29 (7)| 00:00:01 |
|* 1 | HASH JOIN | | 33333 | 16M| 29 (7)| 00:00:01 |
| 2 | TABLE ACCESS FULL | T2 | 1000 | 172K| 5 (0)| 00:00:01 |
|* 3 | HASH JOIN | | 100 | 35400 | 23 (5)| 00:00:01 |
| 4 | TABLE ACCESS FULL| T3 | 100 | 17700 | 4 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T2"."OWNER")
3 - access("T1"."OBJECT_ID"="T3"."OBJECT_ID")
Note
-----
- dynamic sampling used for this statement
已选择22行。
SQL> drop table t2;
表已删除。
SQL> create table t2 as select * from dba_objects where rownum<10001;
表已创建。
SQL> select count(*) from t1;
COUNT(*)
----------
10000
SQL> select count(*) from t2;
COUNT(*)
----------
10000
SQL> explain plan for
2 select * from t1,t2 where t1.owner=t2.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1838229974
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12M| 4220M| 135 (74)| 00:00:03 |
|* 1 | HASH JOIN | | 12M| 4220M| 135 (74)| 00:00:03 |
| 2 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T2 | 10000 | 1728K| 18 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T2"."OWNER")
Note
-----
- dynamic sampling used for this statement
已选择19行。
SQL> explain plan for
2 select/*+swap_join_inputs(t2)*/ * from t1,t2 where t1.owner=t2.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2959412835
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12M| 4220M| 135 (74)| 00:00:03 |
|* 1 | HASH JOIN | | 12M| 4220M| 135 (74)| 00:00:03 |
| 2 | TABLE ACCESS FULL| T2 | 10000 | 1728K| 18 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
---------------------------------------------------------------------------
这里swap_join_inputs起作用了,猜测是因为optimizer认为两个表cost完全一样,所以没有忽略hint
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T2"."OWNER")
Note
-----
- dynamic sampling used for this statement
已选择19行。
SQL> explain plan for
2 select/*+no_swap_join_inputs(t1)*/ * from t1,t2 where t1.owner=t2.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1838229974
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12M| 4220M| 135 (74)| 00:00:03 |
|* 1 | HASH JOIN | | 12M| 4220M| 135 (74)| 00:00:03 |
| 2 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T2 | 10000 | 1728K| 18 (0)| 00:00:01 |
---------------------------------------------------------------------------
这里no_swap_join_inputs没有起作用(原因不明)
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T2"."OWNER")
Note
-----
- dynamic sampling used for this statement
已选择19行。
SQL> select count(*) from t1;
COUNT(*)
----------
10000
SQL> select count(*) from t3;
COUNT(*)
----------
100
SQL> explain plan for
2 select * from t1,t3 where t1.owner=t3.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 740309051
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 125K| 42M| 24 (9)| 00:00:01 |
|* 1 | HASH JOIN | | 125K| 42M| 24 (9)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T3 | 100 | 17700 | 4 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T3"."OWNER")
Note
-----
- dynamic sampling used for this statement
已选择19行。
SQL> explain plan for
2 select/*+no_swap_join_inputs(t3)*/ * from t1,t3 where t1.owner=t3.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 740309051
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 125K| 42M| 24 (9)| 00:00:01 |
|* 1 | HASH JOIN | | 125K| 42M| 24 (9)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T3 | 100 | 17700 | 4 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T3"."OWNER")
Note
-----
- dynamic sampling used for this statement
已选择19行。
SQL> explain plan for
2 select/*+swap_join_inputs(t1)*/ * from t1,t3 where t1.owner=t3.owner;
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 740309051
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 125K| 42M| 24 (9)| 00:00:01 |
|* 1 | HASH JOIN | | 125K| 42M| 24 (9)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T3 | 100 | 17700 | 4 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T1 | 10000 | 1728K| 18 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OWNER"="T3"."OWNER")
Note
-----
- dynamic sampling used for this statement
已选择19行。
这里两个hint都失去效果了,因为两个表大小不一样,所以优化器聪明的选择了cost小的表为内表 |
|