昨天我说,用组合索引优化SQL,并不是最优的,这是因为在8亿的表上面有个等价的物化视图,这个物化视图可以代替我在之前在表上面建立的组合索引。
SQL> explain plan for SELECT distinct * from (select
2 (PROD_9005_GDF_WK_SS_FDIM.PROD_4_NAME),
3 PROD_9005_GDF_WK_SS_FDIM.PROD_5_NAME
4 FROM
5 GLOBL_DEMND_FRCST_WK_FCT,
6 PROD_9005_GDF_WK_SS_FDIM,
7 GDF_SRCE_REGN_LKP
8 WHERE
9 ( GDF_SRCE_REGN_LKP.SRCE_REGN_ID=GLOBL_DEMND_FRCST_WK_FCT.SRCE_REGN_ID )
10 AND ( GLOBL_DEMND_FRCST_WK_FCT.PROD_SKID=PROD_9005_GDF_WK_SS_FDIM.PROD_SKID )
11 AND
12 (GDF_SRCE_REGN_LKP.SRCE_REGN_ID IN ('AA','GC','NE')));
已解释。
已用时间: 00: 00: 00.90
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 900446578
-----------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 258K| 9582K| | 13588 (9)| 00:01:59 | | |
| 1 | SORT UNIQUE | | 258K| 9582K| 236M| 13588 (9)| 00:01:59 | | |
|* 2 | HASH JOIN | | 4887K| 177M| | 3325 (20)| 00:00:29 | | |
| 3 | MERGE JOIN CARTESIAN | | 4242 | 120K| | 3 (0)| 00:00:01 | | |
| 4 | INLIST ITERATOR | | | | | | | | |
|* 5 | INDEX UNIQUE SCAN | GDF_SRCE_REGN_LKP_PK | 3 | 9 | | 1 (0)| 00:00:01 | | |
| 6 | BUFFER SORT | | 1414 | 36764 | | 2 (0)| 00:00:01 | | |
| 7 | PARTITION RANGE SINGLE | | 1414 | 36764 | | 1 (0)| 00:00:01 | 1 | 1 |
| 8 | INDEX FAST FULL SCAN | PROD_9005_GDF_WK_SS_L5MV_IX1 | 1414 | 36764 | | 1 (0)| 00:00:01 | 1 | 1 |
| 9 | PARTITION RANGE ALL | | 8146K| 69M| | 3254 (18)| 00:00:29 | 1 | 106 |
| 10 | PARTITION LIST INLIST | | 8146K| 69M| | 3254 (18)| 00:00:29 |KEY(I) |KEY(I) |
| 11 | MAT_VIEW REWRITE ACCESS FULL| GDFW_M_9005P5_2MV | 8146K| 69M| | 3254 (18)| 00:00:29 | KEY | KEY |
-----------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("PROD_9005_GDF_WK_SS_L5MV"."PROD_5_SKID"="GDFW_M_9005P5_2MV"."PROD_5_SKID" AND
"GDF_SRCE_REGN_LKP"."SRCE_REGN_ID"="GDFW_M_9005P5_2MV"."SRCE_REGN_ID")
5 - access("GDF_SRCE_REGN_LKP"."SRCE_REGN_ID"='AA' OR "GDF_SRCE_REGN_LKP"."SRCE_REGN_ID"='GC' OR
"GDF_SRCE_REGN_LKP"."SRCE_REGN_ID"='NE')
已选择26行。
distinct(PROD_9005_GDF_WK_SS_FDIM.PROD_4_NAME),
PROD_9005_GDF_WK_SS_FDIM.PROD_5_NAME
FROM
GLOBL_DEMND_FRCST_WK_FCT,
PROD_9005_GDF_WK_SS_FDIM,
GDF_SRCE_REGN_LKP
WHERE
( GDF_SRCE_REGN_LKP.SRCE_REGN_ID=GLOBL_DEMND_FRCST_WK_FCT.SRCE_REGN_ID )
AND ( GLOBL_DEMND_FRCST_WK_FCT.PROD_SKID=PROD_9005_GDF_WK_SS_FDIM.PROD_SKID )
AND
( 'ASIA'
=
Case When GDF_SRCE_REGN_LKP.SRCE_REGN_ID IN ('AA','GC','NE')
then 'ASIA'
When GDF_SRCE_REGN_LKP.SRCE_REGN_ID IN ('NA','LA')
Then 'NALA'
When GDF_SRCE_REGN_LKP.SRCE_REGN_ID IN ('WE','CE')
Then 'EMEA'
End );