Comparing the same SELECT in CTAS, INSERT and SELECT
- From: Hemant K Chitale <hkchital@xxxxxxxxxxxxxx>
- To: oracle-l@xxxxxxxxxxxxx
- Date: Sat, 28 Oct 2006 00:12:03 +0800
Oracle 9.2.0.5 RAC on 32-bit Linux
Comparing the same SELECT used in a CTAS, an INSERT and a SELECT-only
operation,
I find that when it is used in the INSERT, Row Source Operations are very high
and there seems to a Full Table scan which is not evident in the Explain Plan.
(note that I "CTRL-C"d the INSERT statement after "waiting" for 45minutes)
The target table TEST_SL has no indexes.
The source table does have indexes, seperately on CLAIM_TIME and LOT_ID.
I'm not yet comfortable with the Inline View and the GROUP BY on CLAIM_TIME.
For the CTAS :
tkprof of the 10046 Trace
CREATE /*+ CTAS */ TABLE hemant.TEST_SL AS
SELECT SOURCE_TABLE.LOT_ID,
SOURCE_TABLE.STORE_TIME,
SOURCE_TABLE.CLAIM_TIME,
SOURCE_TABLE.MOVE_TYPE,
SOURCE_TABLE.OPE_CATEGORY,
SOURCE_TABLE.OPE_NO,
SOURCE_TABLE.PREV_OPE_NO,
SOURCE_TABLE.MAINPD_ID,
SOURCE_TABLE.PREV_MAINPD_ID,
SOURCE_TABLE_SUMMARY.EVENT_COUNT,
0 EVENT_SEQ,
SOURCE_TABLE.OPE_CATEGORY TERM_OPE_CATEGORY
FROM
SOURCE_SCHEMA.SOURCE_TABLE,
(SELECT LOT_ID, CLAIM_TIME, COUNT (*) EVENT_COUNT
FROM SOURCE_SCHEMA.SOURCE_TABLE
GROUP BY LOT_ID, CLAIM_TIME) SOURCE_TABLE_SUMMARY
WHERE
(SOURCE_TABLE.LOT_ID = SOURCE_TABLE_SUMMARY.LOT_ID)
AND (SOURCE_TABLE.CLAIM_TIME = SOURCE_TABLE_SUMMARY.CLAIM_TIME)
AND (SOURCE_TABLE.CLAIM_TIME >= TO_DATE ('05-OCT-2006 07',
'DD-MON-YYYY HH24'))
AND (SOURCE_TABLE.CLAIM_TIME < TO_DATE ('05-OCT-2006 08',
'DD-MON-YYYY HH24'))
call count cpu elapsed disk query current
rows
------- ------ -------- ---------- ---------- ----------
---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.46 12.90 1301 28730 161
2374
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ----------
---------- ----------
total 2 0.46 12.90 1301 28730 161
2374
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 44 (HEMANT)
Rows Execution Plan
------- ---------------------------------------------------
0 CREATE TABLE STATEMENT GOAL: CHOOSE
0 LOAD AS SELECT
0 SORT (GROUP BY)
0 NESTED LOOPS
0 TABLE ACCESS (BY INDEX ROWID) OF 'SOURCE_TABLE'
0 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX01' (NON-UNIQUE)
0 AND-EQUAL
0 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX02' (NON-UNIQUE)
0 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX01' (NON-UNIQUE)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
library cache pin 1 0.00 0.00
row cache lock 18 0.00 0.00
control file sequential read 4 0.00 0.00
db file sequential read 1301 0.03 12.26
global cache cr request 726 0.04 0.18
global cache s to x 1 0.00 0.00
global cache open x 5 0.00 0.00
direct path write 2 0.00 0.00
rdbms ipc reply 1 0.00 0.00
log file sync 1 0.01 0.01
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 4.66 4.66
********************************************************************************
10053 Trace
QUERY
explain plan for
CREATE /*+ CTAS */ TABLE hemant.TEST_SL AS
SELECT SOURCE_TABLE.LOT_ID,
SOURCE_TABLE.STORE_TIME,
SOURCE_TABLE.CLAIM_TIME,
SOURCE_TABLE.MOVE_TYPE,
SOURCE_TABLE.OPE_CATEGORY,
SOURCE_TABLE.OPE_NO,
SOURCE_TABLE.PREV_OPE_NO,
SOURCE_TABLE.MAINPD_ID,
SOURCE_TABLE.PREV_MAINPD_ID,
SOURCE_TABLE_SUMMARY.EVENT_COUNT,
0 EVENT_SEQ,
SOURCE_TABLE.OPE_CATEGORY TERM_OPE_CATEGORY
FROM
SOURCE_SCHEMA.SOURCE_TABLE,
(SELECT LOT_ID, CLAIM_TIME, COUNT (*) EVENT_COUNT
FROM SOURCE_SCHEMA.SOURCE_TABLE
GROUP BY LOT_ID, CLAIM_TIME) SOURCE_TABLE_SUMMARY
WHERE
(SOURCE_TABLE.LOT_ID = SOURCE_TABLE_SUMMARY.LOT_ID)
AND (SOURCE_TABLE.CLAIM_TIME = SOURCE_TABLE_SUMMARY.CLAIM_TIME)
AND (SOURCE_TABLE.CLAIM_TIME >= TO_DATE ('05-OCT-2006 07',
'DD-MON-YYYY HH24'))
AND (SOURCE_TABLE.CLAIM_TIME < TO_DATE ('05-OCT-2006 08',
'DD-MON-YYYY HH24'))
CREATE TABLE STATEME 0
LOAD AS SELECT 1
SORT GROUP BY 2 1
NESTED LOOPS 3 2
TABLE ACCESS SOURCE_TABLE BY INDEX ROWID 4 3
INDEX SOURCE_TABLE_INDEX01 RANGE SCAN 5 4
AND-EQUAL 6 3
INDEX SOURCE_TABLE_INDEX02 RANGE SCAN 7 6
INDEX SOURCE_TABLE_INDEX01 RANGE SCAN 8 6
=========================================================================
For the INSERT :
tkprof of the 10046 Trace :
INSERT /*+ INSERT */ INTO TEST_SL
SELECT SOURCE_TABLE.LOT_ID,
SOURCE_TABLE.STORE_TIME,
SOURCE_TABLE.CLAIM_TIME,
SOURCE_TABLE.MOVE_TYPE,
SOURCE_TABLE.OPE_CATEGORY,
SOURCE_TABLE.OPE_NO,
SOURCE_TABLE.PREV_OPE_NO,
SOURCE_TABLE.MAINPD_ID,
SOURCE_TABLE.PREV_MAINPD_ID,
SOURCE_TABLE_SUMMARY.EVENT_COUNT,
0 EVENT_SEQ,
SOURCE_TABLE.OPE_CATEGORY TERM_OPE_CATEGORY
FROM
SOURCE_SCHEMA.SOURCE_TABLE,
(SELECT LOT_ID, CLAIM_TIME, COUNT (*) EVENT_COUNT
FROM SOURCE_SCHEMA.SOURCE_TABLE
GROUP BY LOT_ID, CLAIM_TIME) SOURCE_TABLE_SUMMARY
WHERE
(SOURCE_TABLE.LOT_ID = SOURCE_TABLE_SUMMARY.LOT_ID)
AND (SOURCE_TABLE.CLAIM_TIME = SOURCE_TABLE_SUMMARY.CLAIM_TIME)
AND (SOURCE_TABLE.CLAIM_TIME >= TO_DATE ('05-OCT-2006 07',
'DD-MON-YYYY HH24'))
AND (SOURCE_TABLE.CLAIM_TIME < TO_DATE ('05-OCT-2006 08',
'DD-MON-YYYY HH24'))
call count cpu elapsed disk query current
rows
------- ------ -------- ---------- ---------- ----------
---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 507.13 2722.39 2538409 4009254 77
0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ----------
---------- ----------
total 2 507.13 2722.39 2538409 4009254 77
0
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 44 (HEMANT)
Rows Row Source Operation
------- ---------------------------------------------------
0 NESTED LOOPS
118481 VIEW
118481 SORT GROUP BY
29968053 TABLE ACCESS FULL OBJ#(269240)
0 TABLE ACCESS BY INDEX ROWID OBJ#(269240)
134801 AND-EQUAL
401316 INDEX RANGE SCAN OBJ#(300586) (object id 300586)
271535 INDEX RANGE SCAN OBJ#(269815) (object id 269815)
Rows Execution Plan
------- ---------------------------------------------------
0 INSERT STATEMENT GOAL: CHOOSE
0 SORT (GROUP BY)
118481 NESTED LOOPS
118481 TABLE ACCESS (BY INDEX ROWID) OF 'SOURCE_TABLE'
29968053 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX01' (NON-UNIQUE)
0 AND-EQUAL
134801 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX02' (NON-UNIQUE)
401316 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX01' (NON-UNIQUE)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
global cache cr request 1198153 0.09 40.66
db file sequential read 161657 0.22 1177.80
db file scattered read 140046 0.33 973.73
latch free 83 0.02 0.23
db file parallel read 2 0.29 0.46
direct path write 4 0.00 0.00
direct path read 4464 0.00 0.02
SQL*Net break/reset to client 1 0.00 0.00
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 1.69 1.69
********************************************************************************
10053 Trace :
QUERY
explain plan for
INSERT /*+ INSERT */ INTO TEST_SL
SELECT SOURCE_TABLE.LOT_ID,
SOURCE_TABLE.STORE_TIME,
SOURCE_TABLE.CLAIM_TIME,
SOURCE_TABLE.MOVE_TYPE,
SOURCE_TABLE.OPE_CATEGORY,
SOURCE_TABLE.OPE_NO,
SOURCE_TABLE.PREV_OPE_NO,
SOURCE_TABLE.MAINPD_ID,
SOURCE_TABLE.PREV_MAINPD_ID,
SOURCE_TABLE_SUMMARY.EVENT_COUNT,
0 EVENT_SEQ,
SOURCE_TABLE.OPE_CATEGORY TERM_OPE_CATEGORY
FROM
SOURCE_SCHEMA.SOURCE_TABLE,
(SELECT LOT_ID, CLAIM_TIME, COUNT (*) EVENT_COUNT
FROM SOURCE_SCHEMA.SOURCE_TABLE
GROUP BY LOT_ID, CLAIM_TIME) SOURCE_TABLE_SUMMARY
WHERE
(SOURCE_TABLE.LOT_ID = SOURCE_TABLE_SUMMARY.LOT_ID)
AND (SOURCE_TABLE.CLAIM_TIME = SOURCE_TABLE_SUMMARY.CLAIM_TIME)
AND (SOURCE_TABLE.CLAIM_TIME >= TO_DATE ('05-OCT-2006 07',
'DD-MON-YYYY HH24'))
AND (SOURCE_TABLE.CLAIM_TIME < TO_DATE ('05-OCT-2006 08',
'DD-MON-YYYY HH24'))
INSERT STATEMENT 0
SORT GROUP BY 1
NESTED LOOPS 2 1
TABLE ACCESS SOURCE_TABLE BY INDEX ROWID 3 2
INDEX SOURCE_TABLE_INDEX01 RANGE SCAN 4 3
AND-EQUAL 5 2
INDEX SOURCE_TABLE_INDEX02 RANGE SCAN 6 5
INDEX SOURCE_TABLE_INDEX01 RANGE SCAN 7 5
=========================================================================
For the SELECT only :
10046 Trace :
SELECT /*+ Pure SELECT */ SOURCE_TABLE.LOT_ID,
SOURCE_TABLE.STORE_TIME,
SOURCE_TABLE.CLAIM_TIME,
SOURCE_TABLE.MOVE_TYPE,
SOURCE_TABLE.OPE_CATEGORY,
SOURCE_TABLE.OPE_NO,
SOURCE_TABLE.PREV_OPE_NO,
SOURCE_TABLE.MAINPD_ID,
SOURCE_TABLE.PREV_MAINPD_ID,
SOURCE_TABLE_SUMMARY.EVENT_COUNT,
0 EVENT_SEQ,
SOURCE_TABLE.OPE_CATEGORY TERM_OPE_CATEGORY
FROM
SOURCE_SCHEMA.SOURCE_TABLE,
(SELECT LOT_ID, CLAIM_TIME, COUNT (*) EVENT_COUNT
FROM SOURCE_SCHEMA.SOURCE_TABLE
GROUP BY LOT_ID, CLAIM_TIME) SOURCE_TABLE_SUMMARY
WHERE
(SOURCE_TABLE.LOT_ID = SOURCE_TABLE_SUMMARY.LOT_ID)
AND (SOURCE_TABLE.CLAIM_TIME = SOURCE_TABLE_SUMMARY.CLAIM_TIME)
AND (SOURCE_TABLE.CLAIM_TIME >= TO_DATE ('05-OCT-2006 07',
'DD-MON-YYYY HH24'))
AND (SOURCE_TABLE.CLAIM_TIME < TO_DATE ('05-OCT-2006 08',
'DD-MON-YYYY HH24'))
call count cpu elapsed disk query current
rows
------- ------ -------- ---------- ---------- ----------
---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 160 0.33 0.32 0 28603 0
2374
------- ------ -------- ---------- ---------- ----------
---------- ----------
total 162 0.33 0.32 0 28603 0
2374
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user id: 44 (HEMANT)
Rows Row Source Operation
------- ---------------------------------------------------
2374 SORT GROUP BY
3494 NESTED LOOPS
2374 TABLE ACCESS BY INDEX ROWID OBJ#(269240)
2374 INDEX RANGE SCAN OBJ#(269815) (object id 269815)
3494 AND-EQUAL
7467 INDEX RANGE SCAN OBJ#(300586) (object id 300586)
7153 INDEX RANGE SCAN OBJ#(269815) (object id 269815)
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
2374 SORT (GROUP BY)
3494 NESTED LOOPS
2374 TABLE ACCESS (BY INDEX ROWID) OF 'SOURCE_TABLE'
2374 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX01' (NON-UNIQUE)
3494 AND-EQUAL
7467 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX02' (NON-UNIQUE)
7153 INDEX (RANGE SCAN) OF 'SOURCE_TABLE_INDEX01' (NON-UNIQUE)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 160 0.00 0.00
SQL*Net message from client 160 3.57 18.64
********************************************************************************
10053 Trace :
QUERY
explain plan for
SELECT /*+ Pure SELECT */ SOURCE_TABLE.LOT_ID,
SOURCE_TABLE.STORE_TIME,
SOURCE_TABLE.CLAIM_TIME,
SOURCE_TABLE.MOVE_TYPE,
SOURCE_TABLE.OPE_CATEGORY,
SOURCE_TABLE.OPE_NO,
SOURCE_TABLE.PREV_OPE_NO,
SOURCE_TABLE.MAINPD_ID,
SOURCE_TABLE.PREV_MAINPD_ID,
SOURCE_TABLE_SUMMARY.EVENT_COUNT,
0 EVENT_SEQ,
SOURCE_TABLE.OPE_CATEGORY TERM_OPE_CATEGORY
FROM
SOURCE_SCHEMA.SOURCE_TABLE,
(SELECT LOT_ID, CLAIM_TIME, COUNT (*) EVENT_COUNT
FROM SOURCE_SCHEMA.SOURCE_TABLE
GROUP BY LOT_ID, CLAIM_TIME) SOURCE_TABLE_SUMMARY
WHERE
(SOURCE_TABLE.LOT_ID = SOURCE_TABLE_SUMMARY.LOT_ID)
AND (SOURCE_TABLE.CLAIM_TIME = SOURCE_TABLE_SUMMARY.CLAIM_TIME)
AND (SOURCE_TABLE.CLAIM_TIME >= TO_DATE ('05-OCT-2006 07',
'DD-MON-YYYY HH24'))
AND (SOURCE_TABLE.CLAIM_TIME < TO_DATE ('05-OCT-2006 08',
'DD-MON-YYYY HH24'))
SELECT STATEMENT 0
SORT GROUP BY 1
NESTED LOOPS 2 1
TABLE ACCESS SOURCE_TABLE BY INDEX ROWID 3 2
INDEX SOURCE_TABLE_INDEX01 RANGE SCAN 4 3
AND-EQUAL 5 2
INDEX SOURCE_TABLE_INDEX02 RANGE SCAN 6 5
INDEX SOURCE_TABLE_INDEX01 RANGE SCAN 7 5
Hemant K Chitale
http://web.singnet.com.sg/~hkchital
--
//www.freelists.org/webpage/oracle-l
Other related posts: