This is a resubmission on an earlier enquiry

From: Mick <mjmstud_at_gmail.com>
Date: Mon, 15 Nov 2010 20:18:48 -0800 (PST)
Message-ID: <f9b9e2ac-2f18-4d44-9b73-6867a3b515fe_at_w18g2000vbe.googlegroups.com>



This is a resubmission on an earlier enquiry (Many thanks to Randolf for his advice on how to present the relevant information)

The following SQL statement has been identified as a poorly performing query.
It currently takes up to 40 seconds.
In some situations this can take 7 seconds but this is usually a short time after the instance is bounced.
This is the statement :

{code}

SELECT
objecttype.id_object
FROM PHY_ALL_OBJECTS objecttype
WHERE

        objecttype.id_type_definition = 'duotA50'
AND     objecttype.date_delete is null
AND
        (
                id_parent not in
                (
                        SELECT id_object from folders f START WITH
f.id_object = 'fA464'
                        CONNECT BY prior f.id_object = f.id_parent
                )
        )
        AND     UPPER(objecttype.name) LIKE UPPER('%coghlan%')
;
{code}

The version of the database is 10.2.0.1.0

The parameters relevant to the optimizer are :

{code}

SQL>
SQL> show parameter optimizer

NAME                                 TYPE        VALUE
------------------------------------ -----------
------------------------------
optimizer_dynamic_sampling           integer     2
optimizer_features_enable            string      10.2.0.1
optimizer_index_caching              integer     0
optimizer_index_cost_adj             integer     100
optimizer_mode                       string      ALL_ROWS
optimizer_secure_view_merging        boolean     TRUE
SQL> show parameter db_file_multi
NAME                                 TYPE        VALUE
------------------------------------ -----------
------------------------------
db_file_multiblock_read_count        integer     16
SQL>
SQL> show parameter db_block_size
NAME                                 TYPE        VALUE
------------------------------------ -----------
------------------------------
db_block_size                        integer     8192

{code}

The explain plan output is as follows :

{code}

SQL>
SQL> explain plan for
  3 SELECT
  4 objecttype.id_object
  5 FROM OBJECTIVE.PHY_ALL_OBJECTS objecttype   6 WHERE

  7          objecttype.id_type_definition = 'duotA50'
  8  AND     objecttype.date_delete is null
  9  AND
 10          (
 11                  id_parent not in
 12                  (
 13                          SELECT id_object from objective.folders f
START WITH f.id_object = 'fA464'
 14                          CONNECT BY prior f.id_object =
f.id_parent
 15                  )
 16          )
 17          AND     UPPER(objecttype.name) LIKE UPPER('%coghlan%')
 18 ;

Explained.

Elapsed: 00:00:00.01

SQL>
SQL>
SQL>
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT



Plan hash value: 3719432900
| Id  | Operation                      |
Name                           | Rows  | Bytes | Cost (%CPU)| Time
|

| 0 | SELECT STATEMENT
|                                | 13162 |  1529K|  2007   (1)|
00:00:25 |
|* 1 | HASH JOIN RIGHT ANTI
|                                | 13162 |  1529K|  2007   (1)|
00:00:25 |
|   2 |   VIEW                         |
VW_NSO_1                       |    31 |   310 |     3   (0)| 00:00:01
|
|*  3 |    CONNECT BY WITH FILTERING
|                                |       |       |
|          |
|   4 |     TABLE ACCESS BY INDEX ROWID|
FOLDERS                        |       |       |            |
|
|*  5 |      INDEX RANGE SCAN          |
INDEX_FOLDERS_ID_OBJECT_PARENT |     1 |     9 |     3   (0)| 00:00:01
|
|   6 |     NESTED LOOPS
|                                |       |       |
|          |
|   7 |      BUFFER SORT
|                                |       |       |
|          |
|   8 |       CONNECT BY PUMP
|                                |       |       |
|          |
|*  9 |      INDEX RANGE SCAN          |
INDEX_FOLDERS_ID_PARENT        |    31 |   527 |     3   (0)| 00:00:01
|
|* 10 |     TABLE ACCESS FULL          |
FOLDERS                        |    31 |   527 |     3   (0)| 00:00:01
|
|* 11 |   TABLE ACCESS FULL            |
PHY_ALL_OBJECTS                | 13250 |  1410K|  2003   (1)| 00:00:25
|

Predicate Information (identified by operation id):


   1 - access("ID_PARENT"="$nso_col_1")
   3 - filter("F"."ID_OBJECT"='fA464')
   5 - access("F"."ID_OBJECT"='fA464')
   9 - access("F"."ID_PARENT"=NULL)
  10 - access("F"."ID_PARENT"=NULL)
  11 - filter(UPPER("OBJECTTYPE"."NAME") LIKE '%COGHLAN%' AND
"OBJECTTYPE"."DATE_DELETE" IS NULL AND
              "OBJECTTYPE"."ID_TYPE_DEFINITION"='duotA50')

29 rows selected.

Elapsed: 00:00:00.51
{code}

Here is the output of SQL*Plus AUTOTRACE including the TIMING information :

{code}

SQL> SELECT
  2 objecttype.id_object
  3 FROM OBJECTIVE.PHY_ALL_OBJECTS objecttype   4 WHERE

  5          objecttype.id_type_definition = 'duotA50'
  6  AND     objecttype.date_delete is null
  7  AND
  8          (
  9                  id_parent not in
 10                  (
 11                          SELECT id_object from objective.folders f
START WITH f.id_object = 'fA464'
 12                          CONNECT BY prior f.id_object =
f.id_parent
 13                  )
 14          )
 15          AND     UPPER(objecttype.name) LIKE UPPER('%coghlan%')
 16 ;

18 rows selected.

Elapsed: 00:00:16.26

Execution Plan



Plan hash value: 3719432900
| Id  | Operation                      |
Name                           | Rows  | Bytes | Cost (%CPU)| Time
|

| 0 | SELECT STATEMENT
|                                | 13162 |  1529K|  2007   (1)|
00:00:25 |
|* 1 | HASH JOIN RIGHT ANTI
|                                | 13162 |  1529K|  2007   (1)|
00:00:25 |
|   2 |   VIEW                         |
VW_NSO_1                       |    31 |   310 |     3   (0)| 00:00:01
|
|*  3 |    CONNECT BY WITH FILTERING
|                                |       |       |
|          |
|   4 |     TABLE ACCESS BY INDEX ROWID|
FOLDERS                        |       |       |            |
|
|*  5 |      INDEX RANGE SCAN          |
INDEX_FOLDERS_ID_OBJECT_PARENT |     1 |     9 |     3   (0)| 00:00:01
|
|   6 |     NESTED LOOPS
|                                |       |       |
|          |
|   7 |      BUFFER SORT
|                                |       |       |
|          |
|   8 |       CONNECT BY PUMP
|                                |       |       |
|          |
|*  9 |      INDEX RANGE SCAN          |
INDEX_FOLDERS_ID_PARENT        |    31 |   527 |     3   (0)| 00:00:01
|
|* 10 |     TABLE ACCESS FULL          |
FOLDERS                        |    31 |   527 |     3   (0)| 00:00:01
|
|* 11 |   TABLE ACCESS FULL            |
PHY_ALL_OBJECTS                | 13250 |  1410K|  2003   (1)| 00:00:25
|

Predicate Information (identified by operation id):


   1 - access("ID_PARENT"="$nso_col_1")
   3 - filter("F"."ID_OBJECT"='fA464')
   5 - access("F"."ID_OBJECT"='fA464')
   9 - access("F"."ID_PARENT"=NULL)
  10 - access("F"."ID_PARENT"=NULL)
  11 - filter(UPPER("OBJECTTYPE"."NAME") LIKE '%COGHLAN%' AND
"OBJECTTYPE"."DATE_DELETE" IS NULL AND
              "OBJECTTYPE"."ID_TYPE_DEFINITION"='duotA50')


Statistics


         68 recursive calls
    3863654 db block gets

     350436  consistent gets
      80537  physical reads
          0  redo size
        794  bytes sent via SQL*Net to client
        469  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          4  sorts (memory)
          1  sorts (disk)
         18  rows processed

{code}

The TKPROF output is as follows :

{code}

SELECT
objecttype.id_object
FROM OBJECTIVE.PHY_ALL_OBJECTS objecttype WHERE

        objecttype.id_type_definition = 'duotA50'
AND     objecttype.date_delete is null
AND
        (
                id_parent not in
                (
                        SELECT id_object from objective.folders f
START WITH f.id_object = 'fA464'
                        CONNECT BY prior f.id_object = f.id_parent
                )
        )
        AND     UPPER(objecttype.name) LIKE UPPER('%coghlan%')

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        2     10.76      15.84      80537     350436
3863654          18

------- ------ -------- ---------- ---------- ---------- ----------
total        4     10.76      15.84      80537     350436
3863654          18

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS

Rows Row Source Operation

-------  ---------------------------------------------------
     18  HASH JOIN RIGHT ANTI (cr=350436 pr=80537 pw=11472
time=15723573 us)
 532715 VIEW VW_NSO_1 (cr=341349 pr=77514 pw=11472 time=15839397 us)
 532715 CONNECT BY WITH FILTERING (cr=341349 pr=77514 pw=11472 time=15306680 us)

      2 TABLE ACCESS BY INDEX ROWID FOLDERS (cr=8 pr=0 pw=0 time=61 us)

      2 INDEX RANGE SCAN INDEX_FOLDERS_ID_OBJECT_PARENT (cr=6 pr=0 pw=0 time=45 us)(object id 184772)

 511191     NESTED LOOPS  (cr=319884 pr=0 pw=0 time=1062081 us)
 158874      BUFFER SORT (cr=0 pr=0 pw=0 time=39648 us)
 168488       CONNECT BY PUMP  (cr=0 pr=0 pw=0 time=9 us)
 511191      INDEX RANGE SCAN INDEX_FOLDERS_ID_PARENT (cr=319884 pr=0
pw=0 time=446132 us)(object id 184771)
 713323     TABLE ACCESS FULL FOLDERS (cr=21457 pr=18282 pw=0 time=63
us)
     18   TABLE ACCESS FULL PHY_ALL_OBJECTS (cr=9087 pr=3023 pw=0
time=5606 us)

Elapsed times include waiting on following events:

  Event waited on                             Times   Max. Wait  Total
Waited
  • Waited ----------
    SQL*Net message to client 2 0.00 0.00 direct path write temp 656 0.08 3.56 db file sequential read 166 0.00 0.00 db file scattered read 1528 0.00 0.11 direct path read temp 52455 0.03 3.17 SQL*Net message from client 2 0.00 0.00

{code}

The DBMS_XPLAN.DISPLAY_CURSOR output is :

{code}

SQL> select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST')); PLAN_TABLE_OUTPUT



SQL_ID 828yr6dtfzvar, child number 0

select /*+ gather_plan_statistics */ objecttype.id_object FROM OBJECTIVE.PHY_ALL_OBJECTS objecttype WHERE objecttype.id_type_definition = 'duotA50' AND

    objecttype.date_delete is null AND

(                 id_parent not in
(                         SELECT id_object from
objective.folders f START WITH f.id_object =
'fA464'                         CONNECT BY prior f.id_object =
f.id_parent                 )         )         AND

    UPPER(objecttype.name) LIKE UPPER('%coghlan%')

Plan hash value: 3719432900


| Id  | Operation                      |
Name                           | Starts | E-Rows | A-Rows |   A-Time
| Buffers | Reads | Writes | OMem | 1Mem | Used-Mem |

|* 1 | HASH JOIN RIGHT ANTI
|                                |      1 |  13162 |     18 |
00:00:15.38 |    4214K|  92070 |  11472 |    17M|  3382K|   24M (0)|
|   2 |   VIEW                         |
VW_NSO_1                       |      1 |     31 |    532K|00:00:15.62
|    4205K|  82986 |  11472 |       |       |          |
|*  3 |    CONNECT BY WITH FILTERING
|                                |      1 |        |    532K|
00:00:15.09 |    4205K|  82986 |  11472 |    63M|  2773K|   37M (1)|
|   4 |     TABLE ACCESS BY INDEX ROWID|
FOLDERS                        |      2 |        |      2 |00:00:00.01
|       8 |      4 |      0 |       |       |          |
|*  5 |      INDEX RANGE SCAN          |
INDEX_FOLDERS_ID_OBJECT_PARENT |      2 |      1 |      2 |00:00:00.01
|       6 |      3 |      0 |       |       |          |
|   6 |     NESTED LOOPS
|                                |      2 |        |    511K|
00:00:01.07 |     319K|   2298 |      0 |       |       |          |
|   7 |      BUFFER SORT
|                                |      2 |        |    158K|
00:00:00.04 |       0 |      0 |      0 |  7642K|  1096K| 6792K (0)|
|   8 |       CONNECT BY PUMP
|                                |      2 |        |    168K|
00:00:00.01 |       0 |      0 |      0 |       |       |          |
|*  9 |      INDEX RANGE SCAN          |
INDEX_FOLDERS_ID_PARENT        |    158K|     31 |    511K|00:00:00.46
|     319K|   2298 |      0 |       |       |          |
|  10 |     TABLE ACCESS FULL          |
FOLDERS                        |      1 |     31 |    713K|00:00:00.01
|   21457 |  21452 |      0 |       |       |          |
|* 11 |   TABLE ACCESS FULL            |
PHY_ALL_OBJECTS                |      1 |  13250 |     18 |00:00:00.01
|    9087 |   9084 |      0 |       |       |          |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):


   1 - access("ID_PARENT"="$nso_col_1")
   3 - filter("F"."ID_OBJECT"='fA464')
   5 - access("F"."ID_OBJECT"='fA464')
   9 - access("F"."ID_PARENT"=NULL)
  11 - filter((UPPER("OBJECTTYPE"."NAME") LIKE '%COGHLAN%' AND
"OBJECTTYPE"."DATE_DELETE" IS NULL AND
"OBJECTTYPE"."ID_TYPE_DEFINITION"='duotA50'))

34 rows selected.
{code}

I welcome any suggestions on how I can improve the performance of this statement.
Please note that I have not control of the SQL code because it is vendor generated.
Having said that, if anyone can show a change to the code that can cause a significant improvement then
the vendor may be open to some changing to the coding. I am also open to other suggestions that may provide some performance improvements, i.e.

  • Changing of SGA parameters, sort_area_size, etc
  • Upgrading to Oracle 11
  • Suggestions for a materialized view.

Many thanks for considering this request. Received on Mon Nov 15 2010 - 22:18:48 CST

Original text of this message