Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.misc -> Re: View vs Underlying Query Performance Question
Thanks for your response Martin.
I removed the rownum and recreated the view as gpc_tp_query_vw2 and ran the following query.
select * from gpc_tp_query_vw2 where userid = 'campbk2';
The query is still slow. Any other thoughts?
Here is the explain plan...
| Id | Operation | Name
| 0 | SELECT STATEMENT |
| 24027 | 5349K| | 88688 |
| 1 | CONCATENATION |
| | | | |
| 2 | NESTED LOOPS |
| 61849 | 7187K| | 43533 |
|* 3 | HASH JOIN |
| 1 | 56 | | 4 |
| 4 | TABLE ACCESS FULL | GPC_ENTITY_XREF
| 2 | 28 | | 2 |
|* 5 | HASH JOIN |
| 23417 | 5213K| 14M| 48091 |
|* 6 | HASH JOIN |
| 19728 | 3178K| | 46853 |
| 7 | TABLE ACCESS FULL | GPC_BUSINESS
| 2420 | 33880 | | 4 |
|* 8 | HASH JOIN |
| 20036 | 2954K| 38M| 46844 |
|* 9 | TABLE ACCESS BY INDEX ROWID | GPC_BATCH_TEMP
| 1 | 42 | | 2 |
|* 10 | INDEX RANGE SCAN | GPC_BATCH_TEMP_USERID_IDX
| 1 | | | 1 |
| 11 | TABLE ACCESS FULL | GPC_PRODUCT_LBM
| 963K| 29M| | 828 |
| 12 | TABLE ACCESS FULL | GPC_PRODUCT
| 321K| 19M| | 383 |
|* 13 | TABLE ACCESS BY INDEX ROWID | GPC_ENTITY_COST
| 42M| 2577M| | 43119 |
|* 14 | INDEX UNIQUE SCAN | GPC_ENTITY_COST_PK
| | | | |
| 15 | NESTED LOOPS |
| 19728 | 3178K| | 46853 |
| 16 | NESTED LOOPS |
| 61849 | 7187K| | 43533 |
| 17 | NESTED LOOPS |
| 20036 | 2954K| | 46844 |
| 18 | NESTED LOOPS |
| 1 | 56 | | 4 |
| 19 | NESTED LOOPS |
| 23417 | 5213K| | 48091 |
|* 20 | TABLE ACCESS BY INDEX ROWID | GPC_BATCH_TEMP
| 1 | 42 | | 2 |
|* 21 | INDEX RANGE SCAN | GPC_BATCH_TEMP_USERID_IDX
| 1 | | | 1 |
| 22 | TABLE ACCESS BY INDEX ROWID | GPC_PRODUCT
| 321K| 19M| | 383 |
|* 23 | INDEX UNIQUE SCAN | GPC_PRODUCT_PK
| 1 | | | |
| 24 | TABLE ACCESS BY INDEX ROWID | GPC_ENTITY_XREF
| 2 | 28 | | 2 |
|* 25 | INDEX RANGE SCAN | GPC_COST_ENTITY_PRD_EI_IDX
| 2 | | | 1 |
| 26 | TABLE ACCESS BY INDEX ROWID | GPC_PRODUCT_LBM
| 963K| 29M| | 828 |
|* 27 | INDEX RANGE SCAN | GPC_PRODUCT_LBM_PK
| 1 | | | |
|* 28 | TABLE ACCESS BY INDEX ROWID | GPC_ENTITY_COST
| 42M| 2577M| | 43119 |
|* 29 | INDEX UNIQUE SCAN | GPC_ENTITY_COST_PK
| | | | |
|* 30 | TABLE ACCESS BY INDEX ROWID | GPC_BUSINESS
| 2420 | 33880 | | 4 |
|* 31 | INDEX UNIQUE SCAN | GPC_BUSINESS_PK
| 1 | | | |
|* 32 | HASH JOIN |
| 23417 | 5213K| 14M| 48091 |
|* 33 | HASH JOIN |
| 19728 | 3178K| | 46853 |
| 34 | TABLE ACCESS FULL | GPC_BUSINESS
| 2420 | 33880 | | 4 |
|* 35 | HASH JOIN |
| 20036 | 2954K| 38M| 46844 |
|* 36 | HASH JOIN |
| 61849 | 7187K| | 43533 |
| 37 | TABLE ACCESS BY INDEX ROWID | GPC_ENTITY_XREF
| 2 | 28 | | 2 |
| 38 | NESTED LOOPS |
| 1 | 56 | | 4 |
|* 39 | TABLE ACCESS BY INDEX ROWID| GPC_BATCH_TEMP
| 1 | 42 | | 2 |
|* 40 | INDEX RANGE SCAN | GPC_BATCH_TEMP_USERID_IDX
| 1 | | | 1 |
|* 41 | INDEX RANGE SCAN | GPC_COST_ENTITY_PRD_EI_IDX
| 2 | | | 1 |
|* 42 | TABLE ACCESS FULL | GPC_ENTITY_COST
| 42M| 2577M| | 43119 |
| 43 | TABLE ACCESS FULL | GPC_PRODUCT_LBM
| 963K| 29M| | 828 |
| 44 | TABLE ACCESS FULL | GPC_PRODUCT
| 321K| 19M| | 383 |
----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
3 - access("X"."ENTITY_ID"="TMP"."ENTITYID")
5 - access("PROD"."GPC_PROD_ID"="PRODLBM"."GPC_PROD_ID")
6 - access("BUS"."FIN_BUSINESS_ID"="TMP"."BUSINESS" AND "PRODLBM"."FIN_PROD_ID"="BUS"."FIN_PROD_ID" AND "PRODLBM"."FISCAL_YEAR_ID"="BUS"."FISCAL_YEAR_ID") 8 - access("PRODLBM"."FISCAL_YEAR_ID"=TO_NUMBER("TMP"."FISCALYEAR"))
9 - filter("TMP"."BUSINESS" IS NOT NULL)
10 - access("TMP"."USERID"='campbk2')
13 - filter("PRODLBM"."END_FM"="ETYCST"."LBM_END_FM")
14 - access("PRODLBM"."GPC_PROD_ID"="ETYCST"."GPC_PROD_ID" AND
"ETYCST"."ENTITY_ID"="X"."COST_ENTITY_ID" AND "PRODLBM"."FISCAL_YEAR_ID"="ETYCST"."FISCAL_YEAR_ID" AND "ETYCST"."END_FM"=12) filter("ETYCST"."FISCAL_YEAR_ID"="X"."FISCAL_YEAR_ID")
20 - filter("TMP"."UPN" IS NOT NULL)
21 - access("TMP"."USERID"='campbk2')
23 - access("PROD"."GPC_PROD_ID"="TMP"."UPN")
25 - access("X"."ENTITY_ID"="TMP"."ENTITYID")
27 - access("PROD"."GPC_PROD_ID"="PRODLBM"."GPC_PROD_ID" AND
"PRODLBM"."FISCAL_YEAR_ID"=TO_NUMBER("TMP"."FISCALYEAR")) 28 - filter("PRODLBM"."END_FM"="ETYCST"."LBM_END_FM")
29 - access("PRODLBM"."GPC_PROD_ID"="ETYCST"."GPC_PROD_ID" AND
"ETYCST"."ENTITY_ID"="X"."COST_ENTITY_ID" AND "PRODLBM"."FISCAL_YEAR_ID"="ETYCST"."FISCAL_YEAR_ID" AND "ETYCST"."END_FM"=12) filter("ETYCST"."FISCAL_YEAR_ID"="X"."FISCAL_YEAR_ID")
30 - filter(LNNVL("BUS"."FIN_BUSINESS_ID"="TMP"."BUSINESS") OR
LNNVL("TMP"."BUSINESS" IS NOT NULL))
31 - access("PRODLBM"."FIN_PROD_ID"="BUS"."FIN_PROD_ID" AND
"PRODLBM"."FISCAL_YEAR_ID"="BUS"."FISCAL_YEAR_ID") 32 - access("PROD"."PRODNO"="TMP"."CATALOG" AND "PROD"."GPC_PROD_ID"="PRODLBM"."GPC_PROD_ID") filter(LNNVL("PROD"."GPC_PROD_ID"="TMP"."UPN") OR LNNVL("TMP"."UPN" IS NOT NULL)) 33 - access("PRODLBM"."FIN_PROD_ID"="BUS"."FIN_PROD_ID" AND
"PRODLBM"."FISCAL_YEAR_ID"="BUS"."FISCAL_YEAR_ID")
filter(LNNVL("BUS"."FIN_BUSINESS_ID"="TMP"."BUSINESS") OR
LNNVL("TMP"."BUSINESS" IS NOT NULL))
35 - access("PRODLBM"."FISCAL_YEAR_ID"=TO_NUMBER("TMP"."FISCALYEAR")
AND
"PRODLBM"."GPC_PROD_ID"="ETYCST"."GPC_PROD_ID" AND
"PRODLBM"."FISCAL_YEAR_ID"="ETYCST"."FISCAL_YEAR_ID"
AND "PRODLBM"."END_FM"="ETYCST"."LBM_END_FM")
36 - access("ETYCST"."ENTITY_ID"="X"."COST_ENTITY_ID" AND
"ETYCST"."FISCAL_YEAR_ID"="X"."FISCAL_YEAR_ID") 39 - filter("TMP"."CATALOG" IS NOT NULL)
40 - access("TMP"."USERID"='campbk2')
41 - access("X"."ENTITY_ID"="TMP"."ENTITYID")
42 - filter("ETYCST"."END_FM"=12)
Note: cpu costing is off
Martin T. wrote:
> Soup wrote: > > SELECT > > X.ENTITY_ID entity, > > PROD.PRODNO Catalog, > > PRODLBM.GPC_PROD_ID UPN, > > BUS.FIN_BUSINESS_ID BUSINESS, > > PRODLBM.FISCAL_YEAR_ID FY, > > ETYCST.TRANSFER_PRICE TP, > > ETYCST.MANUAL_FLAG OVER_RIDE, > > ETYCST.NOTES NOTES, > > ETYCST.CHANGE_USERID CHANGE_USERID, > > ETYCST.CHANGE_TIMESTAMP CHANGE_TIMESTAMP, > > PRODLBM.LBM_PRICE LBM, > > ETYCST.MARKUP_PERCENT MU, > > PROD.PROD_DESC PROD_DESC, > > PROD.UOM_ID UOM, > > PROD.BASE_UOM_ID BASE_UOM, > > PROD.UOM_QUANTITY QTY, > > PRODLBM.FIN_PROD_ID GFS_CODE, > > ETYCST.ORIGIN_ENTITY_ID ORIGIN, > > TMP.BATCHNUM, > > TMP.USERID, > > rownum id > > FROM GPC_PRODUCT PROD > > JOIN GPC_PRODUCT_LBM PRODLBM ON (PROD.GPC_PROD_ID = > > PRODLBM.GPC_PROD_ID) > > JOIN GPC_BUSINESS BUS ON (PRODLBM.FIN_PROD_ID = BUS.FIN_PROD_ID AND > > PRODLBM.FISCAL_YEAR_ID = BUS.FISCAL_YEAR_ID) > > JOIN GPC_ENTITY_COST ETYCST ON (PRODLBM.GPC_PROD_ID = > > ETYCST.GPC_PROD_ID AND PRODLBM.FISCAL_YEAR_ID = ETYCST.FISCAL_YEAR_ID > > AND PRODLBM.END_FM = ETYCST.LBM_END_FM) > > JOIN GPC_ENTITY_XREF X ON (ETYCST.ENTITY_ID = X.COST_ENTITY_ID AND > > ETYCST.FISCAL_YEAR_ID = X.FISCAL_YEAR_ID) > > JOIN GPC_BATCH_TEMP TMP ON (((PROD.PRODNO = NVL(TMP.CATALOG, ' ')) OR > > (PROD.GPC_PROD_ID = NVL(TMP.UPN, ' ')) OR (BUS.FIN_BUSINESS_ID = > > NVL(TMP.BUSINESS, ' '))) AND PRODLBM.FISCAL_YEAR_ID = TMP.FISCALYEAR > > AND X.ENTITY_ID = TMP.ENTITYID) > > WHERE ETYCST.END_FM = 12; > > > > > > ,but personally I don't really mind. > ,that top posting is evil > Others may tell you though > > I think your problem is this: (...) rownum id (...) > When you select the rownum in the view, you prevent Oracle from pushing > any predicate into the view. (Rownum is only a pseudo column and > numbers your result set from 1 to n -- this numbering would change O. > pushed another predicate into the view, hence it doesn't.) > > best, > MartinReceived on Fri Sep 08 2006 - 15:21:41 CDT