Re: Query Transformation

  • From: Patrick Jolliffe <jolliffe@xxxxxxxxx>
  • To: oracle-l <oracle-l@xxxxxxxxxxxxx>
  • Date: Wed, 27 Jan 2021 12:32:30 +0000

I *think* it's related to national characterset (NCHAR/NVARCHAR2).  As
shown below (I hope) current testcase does not reproduce if I switch to
CHAR/VARCHAR2.
Investigation continues, trying to build complete reproducable testcase
from scratch.


SQL> drop table c1 purge;



Table C1 dropped.

SQL> create table c1 nologging
  2  as
  3  with generator as (
  4          select  --+ materialize
  5                  rownum id
  6          from dual
  7          connect by
  8                  level <= 1e4
  9  )
 10  select
 11          cast (trim(to_char(MOD(ROWNUM, 10000000), '099999999')) as
nvarchar2(10)) RZVR01,
 12          MOD(ROWNUM, 1000000) RZPYID
 13  from
 14          generator       v1,
 15          generator       v2
 16  where
 17       rownum <= 17000000;



Table C1 created.

SQL>
SQL> CREATE INDEX c1_I ON c1 (RZVR01, RZPYID);



Index C1_I created.

SQL> exec dbms_stats.gather_table_stats(null, 'c1');



PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> var c1  nvarchar2(10)


SQL> var c2  nvarchar2(10)


SQL>
SQL> exec :c1 := 'A';



PL/SQL procedure successfully completed.

SQL> exec :c2 := 'A';



PL/SQL procedure successfully completed.

SQL>
SQL> explain plan for SELECT /*+ OPT_PARAM('_optimizer_cbqt_or_expansion'
'off') x */ null FROM P2, C1, C2 WHERE
  2  (  ( C1.RZVR01 = :c1 AND C2.GMOBJ BETWEEN  '2201' AND '2299')       OR
  3     ( C1.RZVR01 = :c2 AND C2.GMOBJ = '2019' AND C2.GMSUB = 'IDT'  )   )
 AND
  4      ( P2.RYPYID = C1.RZPYID AND P2.RYGLBA = C2.GMAID );



Explained.

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



 PLAN_TABLE_OUTPUT
____________________________________________________________________________________________
Plan hash value: 4208298132

-----------------------------------------------------------------------------------------
| Id  | Operation                       | Name  | Rows  | Bytes | Cost
(%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |       |     3 |   279 |    37
(0)| 00:00:01 |
|   1 |  CONCATENATION                  |       |       |       |
 |          |
|   2 |   NESTED LOOPS                  |       |     1 |    93 |    19
(0)| 00:00:01 |
|   3 |    NESTED LOOPS                 |       |     1 |    93 |    19
(0)| 00:00:01 |
|   4 |     NESTED LOOPS                |       |     1 |    71 |    17
(0)| 00:00:01 |
|   5 |      INLIST ITERATOR            |       |       |       |
 |          |
|*  6 |       INDEX RANGE SCAN          | C1_I  |     3 |    72 |     5
(0)| 00:00:01 |
|*  7 |      INDEX RANGE SCAN           | C21I  |     1 |    47 |     4
(0)| 00:00:01 |
|*  8 |     INDEX UNIQUE SCAN           | P2_PK |     1 |       |     1
(0)| 00:00:01 |
|*  9 |    TABLE ACCESS BY INDEX ROWID  | P2    |     1 |    22 |     2
(0)| 00:00:01 |
|  10 |   NESTED LOOPS                  |       |     1 |    93 |     9
(0)| 00:00:01 |
|  11 |    NESTED LOOPS                 |       |     1 |    46 |     6
(0)| 00:00:01 |
|* 12 |     INDEX RANGE SCAN            | C1_I  |     1 |    24 |     4
(0)| 00:00:01 |
|  13 |     TABLE ACCESS BY INDEX ROWID | P2    |     1 |    22 |     2
(0)| 00:00:01 |
|* 14 |      INDEX UNIQUE SCAN          | P2_PK |     1 |       |     1
(0)| 00:00:01 |
|* 15 |    INDEX RANGE SCAN             | C21I  |     1 |    47 |     3
(0)| 00:00:01 |
|  16 |   NESTED LOOPS                  |       |     1 |    93 |     9
(0)| 00:00:01 |
|  17 |    NESTED LOOPS                 |       |     1 |    93 |     9
(0)| 00:00:01 |
|  18 |     NESTED LOOPS                |       |     1 |    46 |     6
(0)| 00:00:01 |
|* 19 |      INDEX RANGE SCAN           | C1_I  |     1 |    24 |     4
(0)| 00:00:01 |
|  20 |      TABLE ACCESS BY INDEX ROWID| P2    |     1 |    22 |     2
(0)| 00:00:01 |
|* 21 |       INDEX UNIQUE SCAN         | P2_PK |     1 |       |     1
(0)| 00:00:01 |
|* 22 |     INDEX UNIQUE SCAN           | C2_PK |     1 |       |     2
(0)| 00:00:01 |
|* 23 |    TABLE ACCESS BY INDEX ROWID  | C2    |     1 |    47 |     3
(0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


    PLAN_TABLE_OUTPUT
_________________________________________________________________________________________________

   6 - access("C1"."RZVR01"=SYS_OP_C2C(:C1) OR
"C1"."RZVR01"=SYS_OP_C2C(:C2))
   7 - access("C2"."GMOBJ"=U'2019' AND "C2"."GMSUB"=U'IDT')
       filter("C1"."RZVR01"=SYS_OP_C2C(:C1) AND "C2"."GMOBJ">=U'2201' AND
              "C2"."GMOBJ"<=U'2299' OR "C1"."RZVR01"=SYS_OP_C2C(:C2) AND
"C2"."GMOBJ"=U'2019'
              AND "C2"."GMSUB"=U'IDT')
   8 - access("P2"."RYPYID"="C1"."RZPYID")
   9 - filter("P2"."RYGLBA"="C2"."GMAID")
  12 - access("C1"."RZVR01"=SYS_OP_C2C(:C2))
       filter("C1"."RZVR01"=SYS_OP_C2C(:C1) OR
"C1"."RZVR01"=SYS_OP_C2C(:C2))
  14 - access("P2"."RYPYID"="C1"."RZPYID")
  15 - access("C2"."GMOBJ"=U'2019' AND "C2"."GMSUB"=U'IDT' AND
              "P2"."RYGLBA"="C2"."GMAID")
       filter("C2"."GMOBJ"<=U'2299' AND "C2"."GMOBJ">=U'2201' AND
              (LNNVL("C2"."GMSUB"=U'IDT') OR LNNVL("C2"."GMOBJ"=U'2019')))
  19 - access("C1"."RZVR01"=SYS_OP_C2C(:C1))
       filter("C1"."RZVR01"=SYS_OP_C2C(:C1) OR
"C1"."RZVR01"=SYS_OP_C2C(:C2))
  21 - access("P2"."RYPYID"="C1"."RZPYID")
  22 - access("P2"."RYGLBA"="C2"."GMAID")
  23 - filter("C2"."GMOBJ"<=U'2299' AND "C2"."GMOBJ"<=U'2299' AND
              "C2"."GMOBJ">=U'2201' AND "C2"."GMOBJ">=U'2201' AND
              (LNNVL("C1"."RZVR01"=SYS_OP_C2C(:C2)) OR
LNNVL("C2"."GMOBJ"=U'2019') OR
              LNNVL("C2"."GMSUB"=U'IDT')) AND (LNNVL("C2"."GMSUB"=U'IDT') OR
              LNNVL("C2"."GMOBJ"=U'2019')))

Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (E - Syntax error (1))
---------------------------------------------------------------------------

   1 -  SEL$1
         E -  x


64 rows selected.

SQL>
SQL>
SQL> drop table c1 purge;



Table C1 dropped.

SQL> create table c1 nologging
  2  as
  3  with generator as (
  4          select  --+ materialize
  5                  rownum id
  6          from dual
  7          connect by
  8                  level <= 1e4
  9  )
 10  select
 11          cast (trim(to_char(MOD(ROWNUM, 10000000), '099999999')) as
varchar2(10)) RZVR01,
 12          MOD(ROWNUM, 1000000) RZPYID
 13  from
 14          generator       v1,
 15          generator       v2
 16  where
 17       rownum <= 17000000;



Table C1 created.

SQL>
SQL> CREATE INDEX c1_I ON c1 (RZVR01, RZPYID);



Index C1_I created.

SQL> exec dbms_stats.gather_table_stats(null, 'c1');



PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> var c1  varchar2(10)


SQL> var c2  varchar2(10)


SQL>
SQL> exec :c1 := 'A';



PL/SQL procedure successfully completed.

SQL> exec :c2 := 'A';



PL/SQL procedure successfully completed.

SQL>
SQL> explain plan for SELECT /*+ OPT_PARAM('_optimizer_cbqt_or_expansion'
'off') x */ null FROM P2, C1, C2 WHERE
  2  (  ( C1.RZVR01 = :c1 AND C2.GMOBJ BETWEEN  '2201' AND '2299')       OR
  3     ( C1.RZVR01 = :c2 AND C2.GMOBJ = '2019' AND C2.GMSUB = 'IDT'  )   )
 AND
  4      ( P2.RYPYID = C1.RZPYID AND P2.RYGLBA = C2.GMAID );



Explained.

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



 PLAN_TABLE_OUTPUT
____________________________________________________________________________________________
Plan hash value: 2909362125

-----------------------------------------------------------------------------------------
| Id  | Operation                       | Name  | Rows  | Bytes | Cost
(%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |       |     4 |   336 |    33
(0)| 00:00:01 |
|   1 |  CONCATENATION                  |       |       |       |
 |          |
|   2 |   NESTED LOOPS                  |       |     1 |    84 |     9
(0)| 00:00:01 |
|   3 |    NESTED LOOPS                 |       |     1 |    84 |     9
(0)| 00:00:01 |
|   4 |     MERGE JOIN CARTESIAN        |       |     1 |    62 |     7
(0)| 00:00:01 |
|*  5 |      INDEX RANGE SCAN           | C21I  |     1 |    47 |     5
(0)| 00:00:01 |
|   6 |      BUFFER SORT                |       |     1 |    15 |     2
(0)| 00:00:01 |
|*  7 |       INDEX RANGE SCAN          | C1_I  |     1 |    15 |     2
(0)| 00:00:01 |
|*  8 |     INDEX UNIQUE SCAN           | P2_PK |     1 |       |     1
(0)| 00:00:01 |
|*  9 |    TABLE ACCESS BY INDEX ROWID  | P2    |     1 |    22 |     2
(0)| 00:00:01 |
|  10 |   NESTED LOOPS                  |       |     1 |    84 |     8
(0)| 00:00:01 |
|  11 |    NESTED LOOPS                 |       |     1 |    37 |     5
(0)| 00:00:01 |
|* 12 |     INDEX RANGE SCAN            | C1_I  |     1 |    15 |     3
(0)| 00:00:01 |
|  13 |     TABLE ACCESS BY INDEX ROWID | P2    |     1 |    22 |     2
(0)| 00:00:01 |
|* 14 |      INDEX UNIQUE SCAN          | P2_PK |     1 |       |     1
(0)| 00:00:01 |
|* 15 |    INDEX RANGE SCAN             | C21I  |     1 |    47 |     3
(0)| 00:00:01 |
|  16 |   NESTED LOOPS                  |       |     1 |    84 |     8
(0)| 00:00:01 |
|  17 |    NESTED LOOPS                 |       |     1 |    37 |     5
(0)| 00:00:01 |
|* 18 |     INDEX RANGE SCAN            | C1_I  |     1 |    15 |     3
(0)| 00:00:01 |
|  19 |     TABLE ACCESS BY INDEX ROWID | P2    |     1 |    22 |     2
(0)| 00:00:01 |
|* 20 |      INDEX UNIQUE SCAN          | P2_PK |     1 |       |     1
(0)| 00:00:01 |
|* 21 |    INDEX RANGE SCAN             | C21I  |     1 |    47 |     3
(0)| 00:00:01 |
|  22 |   NESTED LOOPS                  |       |     1 |    84 |     8
(0)| 00:00:01 |
|  23 |    NESTED LOOPS                 |       |     1 |    84 |     8
(0)| 00:00:01 |
|  24 |     NESTED LOOPS                |       |     1 |    37 |     5
(0)| 00:00:01 |
|* 25 |      INDEX RANGE SCAN           | C1_I  |     1 |    15 |     3
(0)| 00:00:01 |
|  26 |      TABLE ACCESS BY INDEX ROWID| P2    |     1 |    22 |     2
(0)| 00:00:01 |
|* 27 |       INDEX UNIQUE SCAN         | P2_PK |     1 |       |     1
(0)| 00:00:01 |


 PLAN_TABLE_OUTPUT
____________________________________________________________________________________________
|* 28 |     INDEX UNIQUE SCAN           | C2_PK |     1 |       |     2
(0)| 00:00:01 |
|* 29 |    TABLE ACCESS BY INDEX ROWID  | C2    |     1 |    47 |     3
(0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   5 - access("C2"."GMOBJ"=U'2019' AND "C2"."GMSUB"=U'IDT')
       filter("C2"."GMSUB"=U'IDT' AND "C2"."GMOBJ"=U'2019')
   7 - access("C1"."RZVR01"=:C2)
       filter("C1"."RZVR01"=:C1 OR "C1"."RZVR01"=:C2)
   8 - access("P2"."RYPYID"="C1"."RZPYID")
   9 - filter("P2"."RYGLBA"="C2"."GMAID")
  12 - access("C1"."RZVR01"=:C1)
       filter("C1"."RZVR01"=:C1 OR "C1"."RZVR01"=:C2)
  14 - access("P2"."RYPYID"="C1"."RZPYID")
  15 - access("C2"."GMOBJ"=U'2019' AND "C2"."GMSUB"=U'IDT' AND
              "P2"."RYGLBA"="C2"."GMAID")
       filter("C2"."GMOBJ"<=U'2299' AND "C2"."GMOBJ">=U'2201' AND
              (LNNVL("C1"."RZVR01"=:C2) OR LNNVL("C2"."GMOBJ"=U'2019') OR
              LNNVL("C2"."GMSUB"=U'IDT')))
  18 - access("C1"."RZVR01"=:C2)
       filter("C1"."RZVR01"=:C1 OR "C1"."RZVR01"=:C2)
  20 - access("P2"."RYPYID"="C1"."RZPYID")
  21 - access("C2"."GMOBJ"=U'2019' AND "C2"."GMSUB"=U'IDT' AND
              "P2"."RYGLBA"="C2"."GMAID")
       filter("C2"."GMOBJ"<=U'2299' AND "C2"."GMOBJ">=U'2201' AND
              (LNNVL("C2"."GMSUB"=U'IDT') OR LNNVL("C2"."GMOBJ"=U'2019')))
  25 - access("C1"."RZVR01"=:C1)
       filter("C1"."RZVR01"=:C1 OR "C1"."RZVR01"=:C2)
  27 - access("P2"."RYPYID"="C1"."RZPYID")
  28 - access("P2"."RYGLBA"="C2"."GMAID")
  29 - filter("C2"."GMOBJ"<=U'2299' AND "C2"."GMOBJ"<=U'2299' AND


     PLAN_TABLE_OUTPUT
__________________________________________________________________________________________________
              "C2"."GMOBJ">=U'2201' AND "C2"."GMOBJ">=U'2201' AND
(LNNVL("C1"."RZVR01"=:C2) OR
              LNNVL("C2"."GMOBJ"=U'2019') OR LNNVL("C2"."GMSUB"=U'IDT')) AND
              (LNNVL("C2"."GMSUB"=U'IDT') OR LNNVL("C2"."GMOBJ"=U'2019')))

Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (E - Syntax error (1))
---------------------------------------------------------------------------

   1 -  SEL$1
         E -  x


76 rows selected.

SQL>

On Wed, 27 Jan 2021 at 09:20, Patrick Jolliffe <jolliffe@xxxxxxxxx> wrote:

No need to apologize, appreciate the effort.  I'm spending the time to
reproduce and build a test-case on my lab environment.
Did anybody (JL?) say that the hardest part of the problem is building the
simplest possible test-case, once you've done that the rest is plain
sailing.  (If not I'll claim it).
More motivated now I've got confirmation that the plan is crazy, I was
thinking it was my brain that was at fault for not understanding it.
I'll update if I get anywhere
Thanks
Patrick


On Tue, 26 Jan 2021 at 22:26, Mark W. Farnham <mwf@xxxxxxxx> wrote:

so sorry. since you already have the 10053, that tells you how the CBO
got the plan.



I thought you wanted a useful plan. Reducing the pieces of the Cartesian
product inputs is an odds on favorite to do that, but if it is already
plenty fast for you, never mind.



*From:* oracle-l-bounce@xxxxxxxxxxxxx [mailto:
oracle-l-bounce@xxxxxxxxxxxxx] *On Behalf Of *Patrick Jolliffe
*Sent:* Tuesday, January 26, 2021 3:40 AM
*To:* oracle-l
*Cc:* Mark W. Farnham
*Subject:* Re: Query Transformation



Thanks Mark, but as detailed, concern is not about optimizing SQL which I
have already done, just understanding how and why the optimizer came up
with the plan for the unchanged SQL.



On Mon, 25 Jan 2021 at 17:31, Mark W. Farnham <mwf@xxxxxxxx> wrote:

First: Just made it so I could read it



SELECT /*+gather_plan_statistics Y */ null FROM P, C1, C2

   WHERE

   (

       (C1.RZVR01 = :nc1 AND C2.GMOBJ BETWEEN  '2201' AND '2299')

    OR (C1.RZVR01 = :nc2 AND C2.GMOBJ = '2019' AND C2.GMSUB = 'IDT')

   )

   AND P.RYPYID = C1.RZPYID

   AND P.RYGLBA = C2.GMAID



Second: Made your claimed correction to a single bind with :nc1 = :nc2,
by the way presuming they are not allowed to be null, since

they appear in an equals.



SELECT /*+gather_plan_statistics Y */ null FROM P, C1, C2

   WHERE

   (

       (C1.RZVR01 = :nc1 AND C2.GMOBJ BETWEEN  '2201' AND '2299')

    OR (C1.RZVR01 = :nc1 AND C2.GMOBJ = '2019' AND C2.GMSUB = 'IDT')

   )

   AND P.RYPYID = C1.RZPYID

   AND P.RYGLBA = C2.GMAID



Third: reformed with C1 and C2 pruned prior to the join.



with c1_pruned as (select c1.rzpyid from c1 where c1.rzvr01 = :nc1)

    ,c2_pruned as (select c2.gmaid  from c2

                     where  c2.gmobj between '2201' and '2299'

                        or (c2.gmobj = '2019' and c2.gmsub = 'IDT')

                   )

select /*                          */ null from p, c1_pruned, c2_pruned

   where  p.rypyid = c1_pruned.rzpyid

     and  p.ryglba = c2_pruned.gmaid



Now, IF the single table predicate selectivity is good (meaning highly
selective) on c1 and/or c2, then they should appear as relatively

smaller objects for their respective joins with p. IF nc1 and nc2 must be
identical, notice that these single table prunings don't

involve a join at all. You possibly need no merge hints on the with
clause objects in case Oracle evaluates the cost is better pruning

on the join clauses. IF nc1 and nc2 actually can be different, then you
can factor out c1_pruned_nc1 and c1_pruned_nc2 and produced with results
for each half of the or on c2.



Good luck.



*From:* oracle-l-bounce@xxxxxxxxxxxxx [mailto:
oracle-l-bounce@xxxxxxxxxxxxx] *On Behalf Of *Patrick Jolliffe
*Sent:* Monday, January 25, 2021 4:40 AM
*To:* oracle-l
*Subject:* Query Transformation



Dear List,

On Oracle 19c been looking at a poorly performing plan for a little while
now.  I've simplified it somewhat as per the details below.

I've resolved the problem itself by

1) creating an extended statistic for column group GMOBJ, GMSUB (which
were correlated)

2) getting developers to replace the 2 binds :nc1 and :nc2 with a single
bind, as the values are actually the same although the optimizer doesn't
know this, so this limits it's options.

However I've got myself bogged down in trying to understand the
transformation that has taken place, really for intellectual curiosity.

I think it's some variation on "cost based or expansion", but how has it
transformed into a union of 3 different parts?

Any help greatly appreciated

Patrick



SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS
LAST'));


PLAN_TABLE_OUTPUT

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  5f67d104uv8ht, child number 0
-------------------------------------
SELECT /*+gather_plan_statistics Y */ null FROM P, C1, C2 WHERE (  (
C1.RZVR01 = :nc1 AND C2.GMOBJ BETWEEN  '2201' AND '2299')       OR    (
C1.RZVR01 = :nc2 AND C2.GMOBJ = '2019' AND C2.GMSUB = 'IDT'  )   )  AND
    ( P.RYPYID = C1.RZPYID AND P.RYGLBA = C2.GMAID )

Plan hash value: 1470685083


---------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name  | Starts | E-Rows |
A-Rows |   A-Time   | Buffers |

---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |       |      1 |        |
 0 |00:00:00.18 |   89916 |
|   1 |  CONCATENATION                  |       |      1 |        |
 0 |00:00:00.18 |   89916 |
|   2 |   NESTED LOOPS                  |       |      1 |      1 |
 0 |00:00:00.18 |   89886 |
|   3 |    NESTED LOOPS                 |       |      1 |      1 |
 89115 |00:00:00.13 |     771 |
|   4 |     NESTED LOOPS                |       |      1 |      1 |
 89115 |00:00:00.06 |     745 |
|   5 |      INLIST ITERATOR            |       |      1 |        |
 3 |00:00:00.01 |       8 |
|*  6 |       INDEX RANGE SCAN          | C1_I  |      2 |      3 |
 3 |00:00:00.01 |       8 |
|*  7 |      INDEX RANGE SCAN           | C21I  |      3 |      1 |
 89115 |00:00:00.05 |     737 |
|*  8 |     INDEX UNIQUE SCAN           | P_PK  |  89115 |      1 |
 89115 |00:00:00.04 |      26 |
|*  9 |    TABLE ACCESS BY INDEX ROWID  | P     |  89115 |      1 |
 0 |00:00:00.05 |   89115 |
|  10 |   NESTED LOOPS                  |       |      1 |      1 |
 0 |00:00:00.01 |      26 |
|  11 |    NESTED LOOPS                 |       |      1 |      1 |
 3 |00:00:00.01 |      15 |
|* 12 |     INDEX RANGE SCAN            | C1_I  |      1 |      1 |
 3 |00:00:00.01 |       4 |
|  13 |     TABLE ACCESS BY INDEX ROWID | P     |      3 |      1 |
 3 |00:00:00.01 |      11 |
|* 14 |      INDEX UNIQUE SCAN          | P_PK  |      3 |      1 |
 3 |00:00:00.01 |       8 |
|* 15 |    INDEX RANGE SCAN             | C21I  |      3 |      1 |
 0 |00:00:00.01 |      11 |
|  16 |   NESTED LOOPS                  |       |      1 |      1 |
 0 |00:00:00.01 |       4 |
|  17 |    NESTED LOOPS                 |       |      1 |      1 |
 0 |00:00:00.01 |       4 |
|  18 |     NESTED LOOPS                |       |      1 |      1 |
 0 |00:00:00.01 |       4 |
|* 19 |      INDEX RANGE SCAN           | C1_I  |      1 |      1 |
 0 |00:00:00.01 |       4 |
|  20 |      TABLE ACCESS BY INDEX ROWID| P     |      0 |      1 |
 0 |00:00:00.01 |       0 |
|* 21 |       INDEX UNIQUE SCAN         | P_PK  |      0 |      1 |
 0 |00:00:00.01 |       0 |
|* 22 |     INDEX UNIQUE SCAN           | C2_PK |      0 |      1 |
 0 |00:00:00.01 |       0 |
|* 23 |    TABLE ACCESS BY INDEX ROWID  | C2    |      0 |      1 |
 0 |00:00:00.01 |       0 |

---------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   6 - access(("C1"."RZVR01"=:NC1 OR "C1"."RZVR01"=:NC2))
   7 - access("C2"."GMOBJ"=U'2019' AND "C2"."GMSUB"=U'IDT')
       filter((("C1"."RZVR01"=:NC1 AND "C2"."GMOBJ">=U'2201' AND
"C2"."GMOBJ"<=U'2299') OR
              ("C1"."RZVR01"=:NC2 AND "C2"."GMOBJ"=U'2019' AND
"C2"."GMSUB"=U'IDT')))
   8 - access("P"."RYPYID"="C1"."RZPYID")
   9 - filter("P"."RYGLBA"="C2"."GMAID")
  12 - access("C1"."RZVR01"=:NC2)
       filter(("C1"."RZVR01"=:NC1 OR "C1"."RZVR01"=:NC2))
  14 - access("P"."RYPYID"="C1"."RZPYID")
  15 - access("C2"."GMOBJ"=U'2019' AND "C2"."GMSUB"=U'IDT' AND
"P"."RYGLBA"="C2"."GMAID")
       filter(("C2"."GMOBJ"<=U'2299' AND "C2"."GMOBJ">=U'2201' AND
              (LNNVL("C2"."GMSUB"=U'IDT') OR
LNNVL("C2"."GMOBJ"=U'2019'))))
  19 - access("C1"."RZVR01"=:NC1)
       filter(("C1"."RZVR01"=:NC1 OR "C1"."RZVR01"=:NC2))
  21 - access("P"."RYPYID"="C1"."RZPYID")
  22 - access("P"."RYGLBA"="C2"."GMAID")
  23 - filter(("C2"."GMOBJ"<=U'2299' AND "C2"."GMOBJ"<=U'2299' AND
"C2"."GMOBJ">=U'2201'
              AND "C2"."GMOBJ">=U'2201' AND (LNNVL("C1"."RZVR01"=:NC2) OR
LNNVL("C2"."GMOBJ"=U'2019') OR
              LNNVL("C2"."GMSUB"=U'IDT')) AND (LNNVL("C2"."GMSUB"=U'IDT')
OR
              LNNVL("C2"."GMOBJ"=U'2019'))))


Other related posts: