【发布时间】:2015-07-29 18:40:14
【问题描述】:
我想微调以下在数据库上运行需要很长时间的查询。查询如下:
SELECT
RSE.RSE_CD_D_BRANCH.FIN_DIVISION_CODE,
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.BUYER,
RSE.RSE_CD_D_PRODUCT_FLAT.BUY_LINE,
RSE.RSE_CD_D_BRANCH.FIN_BRANCH_CODE,
RSE.RSE_CD_D_BRANCH.BRANCH_NUMBER,
RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_NUMBER,
NVL(RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_DESC,RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_DESC_LONG),
SUM(RSE.RSE_IV_F_VALUATION_SV.ON_HAND_QTY),
SUM(RSE.RSE_IV_F_VALUATION_SV.COMMITTED_QTY),
SUM(RSE.RSE_IV_F_VALUATION_SV.COMMITTED_QTY_RAW),
SUM(RSE.RSE_IV_F_VALUATION_SV.DEMAND_PER_DAY_ECL_HUB),
SUM(RSE.RSE_IV_F_VALUATION_SV.INBOUND_RECEIPT_QTY),
RSE.RSE_IV_F_VALUATION_SV.BRANCH_STOCK_FLAG,
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.TOP_200_ITEM_FLAG,
SUBSTR(RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.FULL_ISO,3,2),
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.ORDER_PNT_XFER_PNT
FROM
RSE.RSE_CD_D_BRANCH,
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR,
RSE.RSE_CD_D_PRODUCT_FLAT,
RSE.RSE_IV_F_VALUATION_SV,
RSE.RSE_CD_D_CALENDAR
WHERE
( RSE.RSE_CD_D_BRANCH.DW_BRANCH_ID=RSE.RSE_IV_F_VALUATION_SV.DW_BRANCH_ID )
AND ( RSE.RSE_CD_D_CALENDAR.CALENDAR_DATE=RSE.RSE_IV_F_VALUATION_SV.VALUATION_DATE )
AND ( RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_ID=RSE.RSE_IV_F_VALUATION_SV.PRODUCT_ID )
AND ( RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.PRODUCT_ID=RSE.RSE_IV_F_VALUATION_SV.PRODUCT_ID and RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.DW_BRANCH_ID=RSE.RSE_IV_F_VALUATION_SV.DW_BRANCH_ID )
AND ( RSE.RSE_IV_F_VALUATION_SV.SSO_ID= '570000018' )
AND
(
RSE.RSE_CD_D_CALENDAR.DAY_RELATIVE = 0
AND
RSE.RSE_CD_D_BRANCH.BRANCH_NUMBER NOT IN ( '1167','2305','1581','3129','1075','1078','7995' )
AND
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.ORDER_PNT_XFER_PNT > 0
AND
RSE.RSE_IV_F_VALUATION_SV.LOCATION_TYPE_DESC IN ( 'CONSIGNMENT','STOCK','PREVIEW QUEUE','TAGGED' )
AND
CASE WHEN RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.BASE_STOCK_FLAG = '0' THEN 'N' WHEN RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.BASE_STOCK_FLAG = '1' THEN 'Y' ELSE 'AUTO' END IN ( 'AUTO','Y' )
AND
RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_STATUS_DESC IN ( 'Stock' )
AND
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.FULL_ISO IN ( 'S.A','S.A1','S.A2','S.A3','S.A4','S.B','S.B1','S.B2','S.B3','S.B4','S.NA','S.NB','S.NS','S.S','S.S1','S.S2','S.S3','S.S4','S.T2','S.T3' )
)
GROUP BY
RSE.RSE_CD_D_BRANCH.FIN_DIVISION_CODE,
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.BUYER,
RSE.RSE_CD_D_PRODUCT_FLAT.BUY_LINE,
RSE.RSE_CD_D_BRANCH.FIN_BRANCH_CODE,
RSE.RSE_CD_D_BRANCH.BRANCH_NUMBER,
RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_NUMBER,
NVL(RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_DESC,RSE.RSE_CD_D_PRODUCT_FLAT.PRODUCT_DESC_LONG),
RSE.RSE_IV_F_VALUATION_SV.BRANCH_STOCK_FLAG,
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.TOP_200_ITEM_FLAG,
SUBSTR(RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.FULL_ISO,3,2),
RSE.RSE_CD_D_PRODUCT_BRANCH_CUR.ORDER_PNT_XFER_PNT
HAVING
SUM(RSE.RSE_IV_F_VALUATION_SV.DEMAND_PER_DAY_ECL_HUB) > 0;
以下是解释计划:
Plan hash value: 2631612456
-----------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 215 | 479K (1)| 01:35:59 | | |
|* 1 | FILTER | | | | | | | |
| 2 | HASH GROUP BY | | 1 | 215 | 479K (1)| 01:35:59 | | |
| 3 | NESTED LOOPS | | | | | | | |
| 4 | NESTED LOOPS | | 1 | 215 | 479K (1)| 01:35:59 | | |
| 5 | NESTED LOOPS | | 1 | 116 | 479K (1)| 01:35:59 | | |
| 6 | NESTED LOOPS | | 1 | 97 | 479K (1)| 01:35:59 | | |
|* 7 | HASH JOIN | | 1 | 82 | 479K (1)| 01:35:58 | | |
| 8 | TABLE ACCESS BY INDEX ROWID | RSE_CD_D_CALENDAR | 1 | 13 | 2 (0)| 00:00:01 | | |
|* 9 | INDEX RANGE SCAN | RSE_CD_D_CALENDAR_I5 | 1 | | 1 (0)| 00:00:01 | | |
| 10 | NESTED LOOPS | | | | | | | |
| 11 | NESTED LOOPS | | 173 | 11937 | 479K (1)| 01:35:58 | | |
| 12 | INLIST ITERATOR | | | | | | | |
|* 13 | TABLE ACCESS BY INDEX ROWID | RSE_CD_D_PRODUCT_BRANCH_CUR | 147 | 4263 | 48731 (1)| 00:09:45 | | |
|* 14 | INDEX RANGE SCAN | RSE_CD_D_PROD_BRANC_CUR_I2 | 208K| | 602 (1)| 00:00:08 | | |
| 15 | PARTITION RANGE ALL | | 1 | | 2932 (1)| 00:00:36 | 1 | 1465 |
|* 16 | INDEX RANGE SCAN | RSE_IV_F_VALUATION_I5 | 1 | | 2932 (1)| 00:00:36 | 1 | 1465 |
|* 17 | TABLE ACCESS BY LOCAL INDEX ROWID| RSE_IV_F_VALUATION | 1 | 40 | 2933 (1)| 00:00:36 | 1 | 1 |
|* 18 | TABLE ACCESS BY INDEX ROWID | RSE_IV_D_SECURITY_BRANCH | 1 | 15 | 5 (0)| 00:00:01 | | |
|* 19 | INDEX RANGE SCAN | RSE_IV_D_SECURITY_BRANCH_I2 | 580 | | 1 (0)| 00:00:01 | | |
|* 20 | TABLE ACCESS BY INDEX ROWID | RSE_CD_D_BRANCH | 1 | 19 | 1 (0)| 00:00:01 | | |
|* 21 | INDEX UNIQUE SCAN | RSE_CD_D_BRANCH_PK | 1 | | 0 (0)| 00:00:01 | | |
|* 22 | INDEX UNIQUE SCAN | RSE_CD_PRODUCT_FLAT_PK | 1 | | 1 (0)| 00:00:01 | | |
|* 23 | TABLE ACCESS BY INDEX ROWID | RSE_CD_D_PRODUCT_FLAT | 1 | 99 | 2 (0)| 00:00:01 | | |
-----------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(SUM("A"."DEMAND_PER_DAY_ECL_HUB")>0)
7 - access("RSE_CD_D_CALENDAR"."CALENDAR_DATE"="A"."VALUATION_DATE")
9 - access("RSE_CD_D_CALENDAR"."DAY_RELATIVE"=0)
13 - filter("RSE_CD_D_PRODUCT_BRANCH_CUR"."ORDER_PNT_XFER_PNT">0 AND (CASE "RSE_CD_D_PRODUCT_BRANCH_CUR"."BASE_STOCK_FLAG"
WHEN '0' THEN 'N' WHEN '1' THEN 'Y' ELSE 'AUTO' END ='AUTO' OR CASE "RSE_CD_D_PRODUCT_BRANCH_CUR"."BASE_STOCK_FLAG" WHEN '0'
THEN 'N' WHEN '1' THEN 'Y' ELSE 'AUTO' END ='Y'))
14 - access("RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.A' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.A1' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.A2' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.A3' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.A4' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.B' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.B1' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.B2' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.B3' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.B4' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.NA' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.NB' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.NS' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.S' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.S1' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.S2' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.S3' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.S4' OR
"RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.T2' OR "RSE_CD_D_PRODUCT_BRANCH_CUR"."FULL_ISO"='S.T3')
16 - access("RSE_CD_D_PRODUCT_BRANCH_CUR"."DW_BRANCH_ID"="A"."DW_BRANCH_ID" AND
"RSE_CD_D_PRODUCT_BRANCH_CUR"."PRODUCT_ID"="A"."PRODUCT_ID")
17 - filter("A"."LOCATION_TYPE_DESC"='CONSIGNMENT' OR "A"."LOCATION_TYPE_DESC"='PREVIEW QUEUE' OR
"A"."LOCATION_TYPE_DESC"='STOCK' OR "A"."LOCATION_TYPE_DESC"='TAGGED')
18 - filter("B"."SSO_ID"='570000018')
19 - access("A"."DW_BRANCH_ID"="B"."DW_BRANCH_ID")
20 - filter("RSE_CD_D_BRANCH"."BRANCH_NUMBER"<>'1167' AND "RSE_CD_D_BRANCH"."BRANCH_NUMBER"<>'2305' AND
"RSE_CD_D_BRANCH"."BRANCH_NUMBER"<>'1581' AND "RSE_CD_D_BRANCH"."BRANCH_NUMBER"<>'3129' AND
"RSE_CD_D_BRANCH"."BRANCH_NUMBER"<>'1075' AND "RSE_CD_D_BRANCH"."BRANCH_NUMBER"<>'1078' AND
"RSE_CD_D_BRANCH"."BRANCH_NUMBER"<>'7995')
21 - access("RSE_CD_D_BRANCH"."DW_BRANCH_ID"="A"."DW_BRANCH_ID")
22 - access("RSE_CD_D_PRODUCT_FLAT"."PRODUCT_ID"="A"."PRODUCT_ID")
23 - filter("RSE_CD_D_PRODUCT_FLAT"."PRODUCT_STATUS_DESC"='Stock')
估价日期没有索引,但日期有分区,我无法找到我还能做什么,以便查询花费更少的时间
【问题讨论】:
-
查询访问分区表 RSE_IV_F_VALUATION 的所有分区。我不知道这个查询的目的,但真的有必要访问所有分区吗?该表按哪个列分区?也许按目的查询必须访问所有分区 - 但也许不是。
标签: sql oracle oracle11g oracle10g query-performance