Hi All,
I have a SQL Statement with multiple joins.
Select X Y Z from ......
When I run this statement it runs very fast.
But when I say
Insert into
Select X Y Z from ......
it takes long time.
It doing full scans on couple of tables in the second statement.
What is the issue here ?
Thanks
Sridhar
Sridhar R Patnam
well write is always longer than read, what's your point?
I should have clarified more.
Retrieves 5 rows. SELECT Statement 0.1 Secs
INSERT .. SELECT takes 30 Seconds
On Explaining the Plan, the INSERT...SELECT Statement
is doing Full Table Scans on 2 tables, where as only SELECT statement is not doing it.
Sridhar R Patnam
If you are saying that the plans are different, you are probably going to need to gives us some exact information - statements, plans, etc.
Is there maybe on ORDER BY on the SELECT that is not on the INSERT?
- Chris
SQLPLUS SESSION,
First is SELECT, next is INSERT .. SELECT
**************************************
1 SELECT dc.batch_number, 3 AS rec_type,
2 dt.document_type_description GENERIC_FLD1,
3 cd.name AS GENERIC_FLD2, ds.Status_Description AS GENERIC_FLD3, 0 AS Payment, df.fee_amount
4 df.TC_PCA_OR AS Fund_Code, 0 AS Client_Id, 0 AS Fee_Exempt,
5 dc.Document_Received_Date AS Received_date, '' AS Payor_Name,
6 SYSDATE AS Last_Modified_Date, dc.Document_Number AS RegNumber, 'CORP401'
7 FROM document dc, document_type dt, corp_filing_reference cfr, document_fee df,
8 submitter_batch sb, corp_filing cf, corp_data cd, document_status ds
9 WHERE dc.document_type_id = dt.document_type_id AND
10 dc.document_number = df.document_number(+) AND
11 dc.document_number = cfr.document_number(+) AND
12 dc.document_number = cf.document_number(+) AND
13 cf.filing_number = cd.filing_number(+) AND
14 sb.batch_number = dc.batch_number(+) AND
15 dc.document_status_id = ds.document_status_id(+) AND
16 sb.batch_status_id = 10 AND
17* sb.Entry_User_Id = 'RABARFIELD'
SQL> /
405 3 Entity filing document
405 3 Subsequent Action
405 3 Order
411 3 Subsequent Action
416 3 Annual Report, Franchise Tax
426 3 Entity filing document
6 rows selected.
Elapsed: 00:00:00.71
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 MERGE JOIN (OUTER)
2 1 SORT (JOIN)
3 2 NESTED LOOPS
4 3 NESTED LOOPS (OUTER)
5 4 NESTED LOOPS (OUTER)
6 5 NESTED LOOPS (OUTER)
7 6 NESTED LOOPS (OUTER)
8 7 NESTED LOOPS (OUTER)
9 8 TABLE ACCESS (FULL) OF 'SUBMITTER_BATCH'
10 8 TABLE ACCESS (BY INDEX ROWID) OF 'DOCUMENT
11 10 INDEX (RANGE SCAN) OF 'IDX_DOC_BATCHNUMB
12 7 TABLE ACCESS (BY INDEX ROWID) OF 'DOCUMENT_S
13 12 INDEX (UNIQUE SCAN) OF 'PK_DS_DOCUMENTSTAT
14 6 TABLE ACCESS (BY INDEX ROWID) OF 'CORP_FILING'
15 14 INDEX (UNIQUE SCAN) OF 'PK_CF_DN' (UNIQUE)
16 5 TABLE ACCESS (BY INDEX ROWID) OF 'CORP_DATA'
17 16 INDEX (UNIQUE SCAN) OF 'PK_CD_FN' (UNIQUE)
18 4 INDEX (UNIQUE SCAN) OF 'PK_CFR_DN' (UNIQUE)
19 3 TABLE ACCESS (BY INDEX ROWID) OF 'DOCUMENT_TYPE'
20 19 INDEX (UNIQUE SCAN) OF 'PK_DT_DOCUMENTTYPEID' (UNI
21 1 SORT (JOIN)
22 21 TABLE ACCESS (FULL) OF 'DOCUMENT_FEE'
Statistics
----------------------------------------------------------
0 recursive calls
8 db block gets
98 consistent gets
0 physical reads
0 redo size
1864 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
6 rows processed
**********************************************************************
**********************************************************************
**********************************************************************
SQL> INSERT INTO COB_DETAILS_TEMP
2 SELECT dc.batch_number, 3 AS rec_type,
3 dt.document_type_description GENERIC_FLD1,
4 cd.name AS GENERIC_FLD2, ds.Status_Description AS GENERIC_FLD3, 0 AS Payme
fee_amount AS fee,
5 df.TC_PCA_OR AS Fund_Code, 0 AS Client_Id, 0 AS Fee_Exempt,
6 dc.Document_Received_Date AS Received_date, '' AS Payor_Name,
7 SYSDATE AS Last_Modified_Date, dc.Document_Number AS RegNumber, 'CORP401'
8 FROM document dc, document_type dt, corp_filing_reference cfr, document_fee df,
9 submitter_batch sb, corp_filing cf, corp_data cd, document_status ds
10 WHERE dc.document_type_id = dt.document_type_id AND
11 dc.document_number = df.document_number(+) AND
12 dc.document_number = cfr.document_number(+) AND
13 dc.document_number = cf.document_number(+) AND
14 cf.filing_number = cd.filing_number(+) AND
15 sb.batch_number = dc.batch_number(+) AND
16 dc.document_status_id = ds.document_status_id(+) AND
17 sb.batch_status_id = 10 AND
18 sb.Entry_User_Id = 'RABARFIELD'
19 /
6 rows created.
Elapsed: 00:00:29.32
Execution Plan
----------------------------------------------------------
0 INSERT STATEMENT Optimizer=CHOOSE (Cost=231726 Card=43259225
1 0 NESTED LOOPS (OUTER) (Cost=231726 Card=43259225812265 Byte
2 1 MERGE JOIN (OUTER) (Cost=231726 Card=43259225812265 Byte
3 2 SORT (JOIN) (Cost=196067 Card=13119073282 Bytes=350279
4 3 MERGE JOIN (OUTER) (Cost=196067 Card=13119073282 Byt
5 4 MERGE JOIN (OUTER) (Cost=196065 Card=13119073282 B
6 5 SORT (JOIN) (Cost=154863 Card=844722 Bytes=17316
7 6 HASH JOIN (OUTER) (Cost=12487 Card=844722 Byte
8 7 FILTER
9 8 NESTED LOOPS (OUTER)
10 9 MERGE JOIN (CARTESIAN) (Cost=165 Card=82
11 10 TABLE ACCESS (FULL) OF 'DOCUMENT_TYPE'
12 10 SORT (JOIN) (Cost=164 Card=1 Bytes=38)
13 12 TABLE ACCESS (FULL) OF 'SUBMITTER_BA
14 9 TABLE ACCESS (BY INDEX ROWID) OF 'DOCUME
15 14 INDEX (RANGE SCAN) OF 'IDX_DOC_BATCHNU
16 7 TABLE ACCESS (FULL) OF 'DOCUMENT_STATUS' (Co
17 5 SORT (JOIN) (Cost=41202 Card=1553064 Bytes=40379
18 17 TABLE ACCESS (FULL) OF 'CORP_FILING' (Cost=288
19 4 SORT (JOIN) (Cost=3 Card=82 Bytes=2952)
20 19 TABLE ACCESS (FULL) OF 'DOCUMENT_FEE' (Cost=1 Ca
21 2 SORT (JOIN) (Cost=35659 Card=329743 Bytes=47153249)
22 21 TABLE ACCESS (FULL) OF 'CORP_DATA' (Cost=613 Card=32
23 1 INDEX (UNIQUE SCAN) OF 'PK_CFR_DN' (UNIQUE)
Statistics
----------------------------------------------------------
27 recursive calls
582 db block gets
23410 consistent gets
36586 physical reads
944 redo size
857 bytes sent via SQL*Net to client
1642 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
14 sorts (memory)
2 sorts (disk)
6 rows processed
Sridhar R Patnam
Well, I'm not sure I have an answer yet, but I do have a few comments.
There is one difference between the 2 statements, which could well be a typo:
Payme
fee_amount AS fee,
Also, once we clean things up a little bit:
Code:
SELECT
DC.BATCH_NUMBER, 3 AS REC_TYPE,
DT.DOCUMENT_TYPE_DESCRIPTION GENERIC_FLD1,
CD.NAME AS GENERIC_FLD2, DS.STATUS_DESCRIPTION AS GENERIC_FLD3, 0 AS PAYMENT,
DF.FEE_AMOUNT AS FEE,
DF.TC_PCA_OR AS FUND_CODE, 0 AS CLIENT_ID, 0 AS FEE_EXEMPT,
C.DOCUMENT_RECEIVED_DATE AS RECEIVED_DATE, '' AS PAYOR_NAME,
SYSDATE AS LAST_MODIFIED_DATE, DC.DOCUMENT_NUMBER AS REGNUMBER, 'CORP401'
FROM
SUBMITTER_BATCH SB,
DOCUMENT DC,
DOCUMENT_TYPE DT,
DOCUMENT_FEE DF,
CORP_FILING_REFERENCE CFR,
CORP_FILING CF,
CORP_DATA CD,
DOCUMENT_STATUS DS
WHERE
SB.BATCH_STATUS_ID = 10 AND
SB.ENTRY_USER_ID = 'RABARFIELD' AND
DC.BATCH_NUMBER (+)= SB.BATCH_NUMBER AND
DT.DOCUMENT_TYPE_ID = DC.DOCUMENT_TYPE_ID AND
DF.DOCUMENT_NUMBER (+)= DC.DOCUMENT_NUMBER AND
CFR.DOCUMENT_NUMBER (+)= DC.DOCUMENT_NUMBER AND
CF.DOCUMENT_NUMBER (+)= DC.DOCUMENT_NUMBER AND
CD.FILING_NUMBER (+)= CF.FILING_NUMBER AND
DS.DOCUMENT_STATUS_ID (+)= DC.DOCUMENT_STATUS_ID
...we notice that you missed an outer join between DT and DC.
Further, both plans seem to be bad. They are both doing full-scans on your primary table. Do you not have an index on the 2 fields you are restricting?
The fact that both plans utilize merge joins is rather disturbing. There are only rare cases where Merge Joins make sense.
Also, I'm afraid I have difficulty read non-indented plans... What, exactly, is that FILTER step connected to? I can't figure out what it could possibly be doing since everything is outer-joined.
- Chris
Posting Permissions
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
Forum Rules
Click Here to Expand Forum to Full Width
Bookmarks