近期,在优化一个SQL时用到了QB_NAME的HINT,此HINT我经常使用的原因目的是让子查询单独作为一个整体,与其他表关联时可以进行调整驱动顺序,举例:
SELECT b.owner,
b.object_name,
b.created,
b.status
FROM albert.fc b
WHERE 1=1
AND b.object_id IN
(SELECT c.object_id
FROM albert.P c
WHERE c.owner='NFS_SN')
执行计划如下:
Plan hash value: 3977992979
--------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 569 (100)| | 119 |00:00:00.05 | 1445 |
|* 1 | HASH JOIN RIGHT SEMI | | 1 | 64830 | 569 (11)| 00:00:07 | 119 |00:00:00.05 | 1445 |
| 2 | TABLE ACCESS BY INDEX ROWID| P | 1 | 2192 | 116 (0)| 00:00:02 | 119 |00:00:00.01 | 17 |
|* 3 | INDEX RANGE SCAN | P_IDX01 | 1 | 2192 | 6 (0)| 00:00:01 | 119 |00:00:00.01 | 2 |
| 4 | TABLE ACCESS FULL | FC | 1 | 3000K| 439 (11)| 00:00:06 | 100K|00:00:00.02 | 1428 |
--------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$5DA710D3
2 - SEL$5DA710D3 / C@SEL$2
3 - SEL$5DA710D3 / C@SEL$2
4 - SEL$5DA710D3 / B@SEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
OPT_PARAM('_optim_peek_user_binds' 'false')
OPT_PARAM('_optimizer_use_feedback' 'false')
ALL_ROWS
OUTLINE_LEAF(@"SEL$5DA710D3")
UNNEST(@"SEL$2")
OUTLINE(@"SEL$1")
OUTLINE(@"SEL$2")
FULL(@"SEL$5DA710D3" "B"@"SEL$1")
INDEX_RS_ASC(@"SEL$5DA710D3" "C"@"SEL$2" ("P"."OWNER"))
LEADING(@"SEL$5DA710D3" "B"@"SEL$1" "C"@"SEL$2")
USE_HASH(@"SEL$5DA710D3" "C"@"SEL$2")
SWAP_JOIN_INPUTS(@"SEL$5DA710D3" "C"@"SEL$2")
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("B"."OBJECT_ID"="C"."OBJECT_ID")
3 - access("C"."OWNER"='NFS_SN')
read more