I have recently upgraded a third party application from Oracle 8.1.6 to Oracle 9.2.0.7.0 and all is well apart from a couple of queries that are running poorly. The queries are based on a simple view and I am having problems seeing why the cost based optimiser is behaving as it is with it.
When i run the uderlying query of the view as a SQL statement it gives me a high cost but if I strip out the column list (keeping the rest of the query consitent) it behaves much better. Here are the plans from the 2 versions of the query:
Original Query
----------------
Explain Plan
Set STATEMENT_ID='GJC3'
For
SELECT IF_.R_OBJECT_ID,IF_.OBJECT
_NAME
,IF_.R_OBJECT_TYPE,IF_.TIT
LE
,IF_.SUBJECT,IF_.A_APPLICA
TION_TYPE
,IF_.A_STATUS,IF_.R_CREATI
ON_DATE,IF
_.R_MODIFY
_DATE,IF_.
R_MODIFIER
,IF_.R_ACCESS_DATE,IF_.A_I
S_HIDDEN,I
F_.I_IS_DE
LETED,IF_.
A_RETENTIO
N_DATE
,IF_.A_ARCHIVE,IF_.A_COMPO
UND_ARCHIT
ECTURE,IF_
.A_LINK_RE
SOLVED,IF_
.I_REFEREN
CE_CNT
,IF_.I_HAS_FOLDER,IF_.R_LI
NK_CNT,IF_
.R_LINK_HI
GH_CNT,IF_
.R_ASSEMBL
ED_FROM_ID
,IF_.R_FRZN_ASSEMBLY_CNT,I
F_.R_HAS_F
RZN_ASSEMB
LY,IF_.I_C
ONTENTS_ID
,IF_.A_CON
TENT_TYPE,
IF_.R_PAGE
_CNT
,IF_.R_CONTENT_SIZE,IF_.A_
FULL_TEXT,
IF_.A_STOR
AGE_TYPE,I
F_.I_CABIN
ET_ID
,IF_.OWNER_NAME,IF_.OWNER_
PERMIT,IF_
.GROUP_NAM
E,IF_.GROU
P_PERMIT,I
F_.WORLD_P
ERMIT,IF_.
I_ANTECEDE
NT_ID,IF_.
I_CHRONICL
E_ID,IF_.I
_LATEST_FL
AG,IF_.R_L
OCK_OWNER,
IF_.R_LOCK
_DATE,IF_.
R_LOCK_MAC
HINE,IF_.L
OG_ENTRY,I
F_.I_BRANC
H_CNT,IF_.
I_DIRECT_D
SC,IF_.R_I
MMUTABLE_F
LAG,IF_.R_
FROZEN_FLA
G,IF_.R_HA
S_EVENTS,I
F_.ACL_DOM
AIN,IF_.AC
L_NAME,IF_
.A_SPECIAL
_APP,IF_.D
OCUMENT_NU
MBER,IF_.D
OCUMENT_DA
TE,IF_.ISS
UE_LEVEL
,IF_.I_IS_REFERENCE
,IF_.RESOLUTION_LABEL
,IF_.R_IS_VIRTUAL_DOC
,IF_.R_IS_PUBLIC
,IF_.R_CREATOR_NAME
,IF_.R_POLICY_ID
,IF_.R_RESUME_STATE
,IF_.R_CURRENT_STATE
,IF_.R_ALIAS_SET_ID
,IF_.I_IS_REPLICA
,IF_.A_CATEGORY
,IF_.LANGUAGE_CODE
,IF_.I_VSTAMP
,UY_.DCA_IDENTIFIER
,UY_.DCA_CURRENT_STATUS
,UY_.DCA_PROJECT
,UY_.DCA_DATE_OPENED
,UY_.DCA_DESCRIPTION
,UY_.DCA_FORMAL
,UY_.DCA_WORKFLOW_ID
,UY_.DCA_SUBMITTED
,UY_.DCA_DESTINATION
,UY_.DCA_PUBLISHING_INFO
,UY_.DCA_LOCKOWNER
,UY_.DCA_REJECTION_NOTES
,UY_.DCA_FINALISED_DATE
,UY_.DCA_FORMAL_START_DATE
,UY_.ACTIVE_REVIEWERS
FROM LMREDMS.dm_sysobject_s IF_
,LMREDMS.lm_dca_s UY_
WHERE IF_.R_OBJECT_ID=UY_.R_OBJE
CT_ID
/
Query Plan
--------------------------
----------
----------
----------
----------
----------
----
1.33774 SELECT STATEMENT GJC3 Cost=33774
--2.1 HASH JOIN
--3.1 TABLE ACCESS FULL LM_DCA_S
--3.2 TABLE ACCESS FULL DM_SYSOBJECT_S
Column list removed
-----------------------
Explain Plan
Set STATEMENT_ID='GJC3'
For
SELECT IF_.R_OBJECT_ID
,UY_.R_OBJECT_ID
FROM LMREDMS.dm_sysobject_s IF_
,LMREDMS.lm_dca_s UY_
WHERE IF_.R_OBJECT_ID=UY_.R_OBJE
CT_ID
/
Query Plan
--------------------------
----------
----------
----------
----------
----------
----
1.289 SELECT STATEMENT GJC3 Cost=289
--2.1 NESTED LOOPS
--3.1 INDEX FAST FULL SCAN D_1F004421800001A1 UNIQUE
--3.2 INDEX UNIQUE SCAN D_1F00442180000108 UNIQUE
Can anyone tell me why the first query with all the columns listed takes so much longer than the second. All tables are analyzed and the optimizer rule is set to "Choose. The DM_SYSOBJECTS_S table contains about 1,600,000 rows and the LM_DCA_S table about 33,000. Both tables have an index on the R_OBJECT_ID column
Thanks in advance
Chedgey