Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Mailing Lists -> Oracle-L -> Comparing the same SELECT in CTAS, INSERT and SELECT

Comparing the same SELECT in CTAS, INSERT and SELECT

From: Hemant K Chitale <hkchital_at_singnet.com.sg>
Date: Sat, 28 Oct 2006 00:12:03 +0800
Message-Id: <7.0.1.0.0.20061028001128.01bb2bd8@singnet.com.sg>

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

--
http://www.freelists.org/webpage/oracle-l
Received on Fri Oct 27 2006 - 11:12:03 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US