I need to fine tune a query

Hi All,
I need to fine tune my select query . I am giving a sample query which is model of my Query .
Sample Tables: Employee, Manager, Department
Select a.employee_name,a.employee_age,decode(a.employee_status,'Y','Promoted','Still in Progress'), NVL(b.employee_details , 0),c.department_name from employee a, manager b , department c where a.employee_id =b.employee_id(+) and a.employee_id = c.employee_id(+) and c.department_status in ('Y',A') order by a.employee_joining_date
This is a sample query. In my query which should be fine tune has lot of decode and nvl functions. This query is passed to oracle as string from Java .It takes 2 seconds but it should be taking only fraction of seconds..
What shall i do?
Shall i create materialise views or a function in oracle with return value as sys_refucursor to Java code. does function based index should be used in where clause only. If so what should i do to minimise decode and nvl functions.Please help me

>
Select a.employee_name,a.employee_age,decode(a.employee_status,'Y','Promoted','Still in Progress'),
NVL(b.employee_details , 0),c.department_name from employee a, manager b , department c
where a.employee_id =b.employee_id(+) and a.employee_id = c.employee_id(+) and c.department_status
in ('Y',A') order by a.employee_joining_date I'm wondering why an "employee_details" field is 0 - doesn't make much sense to me.
Also, the (+) syntax is deprecated - use standard ANSI join syntax instead (Mr. Google is your friend).
This is a sample query. In my query which should be fine tune has lot of decode and nvl functions.
This query is passed to oracle as string from Java .It takes 2 seconds but it should be taking only fraction of seconds..Why should it take only a fraction of a second? How do you know this for a fact? TKProf should be
able to tell you what's happening.
What shall i do?
Shall i create materialise views or a function in oracle with return value as sys_refucursor to Java code.
does function based index should be used in where clause only. If so what should i do to minimise
decode and nvl functions.Please help meSounds to me like you're thrashing around desperately in search of a "fancy" solution.
Read some performance books on Oracle - you don't mention your version of Oracle
or your OS, so it's difficult to help with that.
Christopher Lawson's book is an excellent and very readable into to Oracle performance.
Also, Oracle Performance 101 - as well as anything by Tom Kyte. More advanced stuff is
available from Jonathan Lewis and Christian Antognini. Also, take a look at the FAQ for
this group (as recommended by the other poster) and don't forget the docco*
or (short version) RTFM*.
HTH,
Paul...

Similar Messages

  • Need to fine tune Query ....

    Hi...
    SELECT
    a.id, a.fname, a.lname
    FROM
    a inner join b ON a.id = b.id
    WHERE
    a.del_status = 'N' AND a.type = 2
    GROUP BY
    a.id, a.name, a.lname
    if i run this Query it take s one sec
    SELECT
    a.id, a.fname, a.lname
    FROM
    a inner join b ON a.id = b.id
    WHERE
    a.del_status = 'N' AND a.type = 2 and b.status =1
    GROUP BY
    a.id, a.name, a.lname
    if i add status it takes 7 Min
    i cant found the reason
    this is the explain plan for second query
    Operation     Object Name     Rows     Bytes     Cost     Object Node     In/Out     PStart     PStop
    SELECT STATEMENT Optimizer Mode=CHOOSE          73           92                     
    SORT GROUP BY          73      3 K     92                     
    NESTED LOOPS          73      3 K     88                     
    TABLE ACCESS FULL     NOTIFY_SOURCE_DETAIL     73      1 K     15                     
    TABLE ACCESS BY INDEX ROWID     MEMBER     1      20      1                     
    INDEX UNIQUE SCAN     I_MEMBER_2     2                               
    Thanks,

    Hi
    If you have an index on the b.id then Oracle does not have to read the actual data in the first query.
    But when you refer to status, then Oracle will have to retrieve the row and check that field.
    pls. supply BOTH explain plans
    regards
    Mette

  • Help Fine tune this query

    I am running the following query. This is being run for every row that is being loaded. I figured that this is taking the most time
    select distinct h.PRNT_PROD_GRP_ID, h.CHILD_PROD_GRP_ID, pg.PROD_GRP_REPORTING_NM, pg.PROD_GRP_ID, pg.PROD_GRP_TYP_ID
    from PROD_GRP_HCHY_OUTBD h, PROD_GRP pg
    where pg.PROD_GRP_ID = h.PRNT_PROD_GRP_ID and
    pg.PROD_GRP_ID in (select c.PROD_GRP_ID from prod_grp p, prod_grp c, PROD_GRP_HCHY_OUTBD hy, (select h.PRNT_PROD_GRP_ID, h.CHILD_PROD_GRP_ID, level LVLID, PROD_GRP_HCHY_OUTBD_ID from PROD_GRP_HCHY_OUTBD h where h.PROD_MKT_ID in (select pga.PROD_GRP_ID from APLCTN_SYS aps, APLCTN a, PROD_GRP_APLCTN pga where aps.APLCTN_SYS_Cd = 'ETMS' AND aps.APLCTN_SYS_ID = a.APLCTN_SYS_ID and a.APLCTN_ID = pga.APLCTN_ID) start with h.PRNT_PROD_GRP_ID in (select pga.PROD_GRP_ID from APLCTN_SYS aps, APLCTN a, PROD_GRP_APLCTN pga where aps.APLCTN_SYS_Cd = 'ETMS' AND aps.APLCTN_SYS_ID = a.APLCTN_SYS_ID and a.APLCTN_ID = pga.APLCTN_ID) connect by h.PRNT_PROD_GRP_ID = prior h.CHILD_PROD_GRP_ID) TREE where p.prod_grp_id = TREE.PRNT_PROD_GRP_ID and c.prod_grp_id = TREE.CHILD_PROD_GRP_ID and hy.PROD_GRP_HCHY_OUTBD_ID = TREE.PROD_GRP_HCHY_OUTBD_ID) connect by prior h.PRNT_PROD_GRP_ID = h.CHILD_PROD_GRP_ID start with h.CHILD_PROD_GRP_ID = 7650 order by pg.PROD_GRP_TYP_ID;

    hey nick,
    this is the query that is run by Tibco (middleware).
    we are trying to extract this data from the data store and load into a target database.
    this query generates a tree of parent - child rows that belong to a particular criteria.
    everytime the parent is fetched for a particular child, we need to make sure that the parent falls in that criteria and hence the many (in) queries.
    hope this helps

  • Need to fine tune ....

    HI....
    I'm using this block statement it takes more than 15 min .. the cursor query returns 20000 rec is any other way to update this ....pls give solution for this
    declare
    cursor c1 is select m_id from mem where del_status='N' and exists(select 1 from mem_alb where ma_id =mem_id) and exists (select 1 from mem_us where mu_m_id=m_id and MU_USED =0);
    begin
    for idx in c1 loop
         update mem_us set (MUL_PUSED , MU_USED) =(select sum(1),sum(m_size) from mem_alb,mem_alb_poto where map_ma_id=ma_id and ma_m_id=idx.m_id and map_del_status=0 and mal_del_status=0) where mu_m_id=idx.m_id;
    end loop;
    end;

    Hello
    Well, I'm in dire need of a double espresso so apologies if I've missed something, but I think that this is logically equivalent:
    update
         mem_us upd
    set
         (MUL_PUSED , MU_USED) =(select
                                       sum(1),
                                       sum(m_size)
                                  from
                                       mem_alb,
                                       mem_alb_poto
                                  where
                                       map_ma_id=ma_id
                                  and
                                       ma_m_id=upd.m_id
                                  and
                                       map_del_status=0
                                  and
                                  mal_del_status=0
    where
         upd.del_status='N'
    and
         exists(     select
                        1
                   from
                        mem_alb
                   where
                        ma_id =upd.m_id
    and
         exists(     select
                        1
                   from
                        mem_us
                   where
                        mu_m_id=upd.m_id
                   and
                        MU_USED =0
                   );HTH
    David
    Message was edited by:
    david_tyler
    Fixed the formatting
    Message was edited by:
    david_tyler
    Again!
    Message was edited by:
    david_tyler
    Oh I give up! :-)

  • Need help in tune this query.

    Hi All,
    The below query is taking nearly one hour to give the output.
      2  select sku.VK_UNIT
      3       , sku.MODEL
      4       , sku.DESCRIPTION
      5       , slt.GEO
      6       , slt.LEAD_TIME
      7       , slt.REV_LEAD_TIME
      8       , aud.LEAD_TIME        as PREV_LEAD_TIME_GEO
      9       , aud.REV_LEAD_TIME    as PREV_REV_LEAD_TIME_GEO
    10       , slt.COUNTDOWN
    11       , aud.CREATION_DATE    as EDD_CREATION_DATE_GEO
    12       , aud.CREATED_BY       as EDD_CREATED_BY_GEO
    13    from LTC_GLOBAL.LTC_SKU sku
    14       , LTC_GLOBAL.LTC_SKU_LEAD_TIME slt
    15       , (select VK_UNIT
    16               , MODEL
    17               , substr(ACTION_TYPE, 9) as GEO
    18               , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU EDD ' then ACTION_VALUE  else null end) as LEAD_TIME
    19               , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU EDD ' then CREATION_DATE else null end) as CREATION_DATE
    20               , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU EDD ' then CREATED_BY    else null end) as CREATED_BY
    21               , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU RDD ' then ACTION_VALUE  else null end) as REV_LEAD_TIME
    22               , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU RDD ' then CREATION_DATE else null end) as REV_CREATION_DATE
    23               , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU RDD ' then CREATED_BY    else null end) as REV_CREATED_BY
    24            from (select VK_UNIT
    25                       , MODEL
    26                       , ACTION_TYPE
    27                       , ACTION_VALUE
    28                       , CREATION_DATE
    29                       , CREATED_BY
    30                       , PREV_ACTION_VALUE
    31                       , PREV_CREATION_DATE
    32                       , PREV_CREATED_BY
    33                    from (select
    34                                 NOTE         as VK_UNIT
    35                               , NOTE2        as MODEL
    36                               , ACTION_TYPE
    37                               , ACTION_VALUE
    38                               , CREATION_DATE
    39                               , CREATED_BY
    40                               , row_number()        over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as DEPTH
    41                               , lead(CREATION_DATE) over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as PREV_CREATION_DATE
    42                               , lead(CREATED_BY   ) over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as PREV_CREATED_BY
    43                               , lead(ACTION_VALUE ) over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as PREV_ACTION_VALUE
    44                            from LTC_GLOBAL.LTC_AUDIT
    45                           where NOTE is not null
    46                             and NOTE2 is not null
    47                             and ACTION_TYPE is not null
    48                         )
    49                   where DEPTH = 2
    50                     and substr(ACTION_TYPE, 1, 8) in ('SKU EDD ', 'SKU RDD ')
    51                 )
    52           group by VK_UNIT, MODEL, substr(ACTION_TYPE, 9)
    53         ) aud
    54  where slt.VK_UNIT = sku.VK_UNIT
    55     and slt.MODEL   = sku.MODEL
    56     and slt.CLASS   = sku.CLASS
    57     and nvl(slt.LEAD_TIME, slt.REV_LEAD_TIME) is not null
    58     and aud.VK_UNIT (+)= slt.VK_UNIT
    59     and aud.MODEL   (+)= slt.MODEL
    60     and aud.GEO     (+)= slt.GEO;
    PLAN_TABLE_OUTPUT
    Plan hash value: 2687821083
    | Id  | Operation                   | Name              | Rows  | Bytes |TempSpc| Cost (%CPU)| Time  |
    |   0 | SELECT STATEMENT            |                   |   539K|   902M|       |  1005K  (1)| 03:21:05 |
    |*  1 |  HASH JOIN OUTER            |                   |   539K|   902M|    62M|  1005K  (1)| 03:21:05 |
    |*  2 |   HASH JOIN                 |                   |   539K|    56M|    27M| 66402   (1)| 00:13:17 |
    |*  3 |    TABLE ACCESS FULL        | LTC_SKU_LEAD_TIME |   559K|    20M|       | 23201   (2)| 00:04:39 |
    |   4 |    TABLE ACCESS FULL        | LTC_SKU_UNIT      |  5726K|   382M|       | 19570   (1)| 00:03:55 |
    |   5 |   VIEW                      |                   |  4157K|  6522M|       |   610K  (2)| 02:02:02 |
    PLAN_TABLE_OUTPUT
    |   6 |    HASH GROUP BY            |                   |  4157K|   229M|   303M|   610K  (2)| 02:02:02 |
    |*  7 |     VIEW                    |                   |  4157K|   229M|       |   551K  (2)| 01:50:21 |
    |*  8 |      WINDOW SORT PUSHED RANK|                   |  4157K|   229M|   303M|   551K  (2)| 01:50:21 |
    |*  9 |       TABLE ACCESS FULL     | LTC_AUDIT         |  4157K|   229M|       |   493K  (2)| 01:38:41 |
    Predicate Information (identified by operation id):
       1 - access("AUD"."VK_UNIT"(+)="SLT"."VK_UNIT" AND "AUD"."MODEL"(+)="SLT"."MODEL" AND
                  "AUD"."GEO"(+)="SLT"."GEO")
    PLAN_TABLE_OUTPUT
       2 - access("SLT"."VK_UNIT"="UNIT"."VK_UNIT" AND "SLT"."MODEL"="UNIT"."MODEL" AND
                  "SLT"."CLASS"="UNIT"."CLASS")
       3 - filter(NVL("SLT"."LEAD_TIME","SLT"."REV_LEAD_TIME") IS NOT NULL)
       7 - filter("DEPTH"=2)
       8 - filter(ROW_NUMBER() OVER ( PARTITION BY "NOTE","NOTE2","ACTION_TYPE" ORDER BY
                  INTERNAL_FUNCTION("CREATION_DATE") DESC )<=2)
       9 - filter((SUBSTR("ACTION_TYPE",1,8)='SKU EDD ' OR SUBSTR("ACTION_TYPE",1,8)='SKU RDD ') AND
                  "NOTE2" IS NOT NULL AND "ACTION_TYPE" IS NOT NULL)
    30 rows selected.
    SELECT COUNT(*) FROM LTC_GLOBAL.LTC_SKU--5012335
    SELECT COUNT(*) FROM  LTC_GLOBAL.LTC_SKU_LEAD_TIME--8060956
    SELECT COUNT(*) FROM  LTC_GLOBAL.LTC_AUDIT--58309887
    CREATE UNIQUE INDEX LTC_GLOBAL.LTC_SKU_LEAD_TIME_PK ON LTC_GLOBAL.LTC_SKU_LEAD_TIME(VK_UNIT, MODEL, CLASS, GEO)
    CREATE INDEX LTC_GLOBAL.LTC_AUDIT_LEAD_TIME ON LTC_GLOBAL.LTC_AUDIT(ACTION_TYPE)
    CREATE INDEX LTC_GLOBAL.LTC_AUDIT_LEAD_TIME_DOM ON LTC_GLOBAL.LTC_AUDIT(NOTE, NOTE2, ACTION_TYPE)
    CREATE INDEX LTC_GLOBAL.LTC_AUDIT_LEAD_TIME_DOM1 ON LTC_GLOBAL.LTC_AUDIT("CREATION_DATE" DESC)
    Please help me.
    Thanks in advance.

    Thanks for your response.
    Sorry for violating formatting. Since I am not aware of the format options in new environment.
    I have created functional based index on SUBSTR(ACTION_TYPE, 1, 8).
    The cost got reduced some what.But still the query is taking 40 minutes.
    The following predicate it is returning 58296618 rows.
    NOTE is not null  
    and NOTE2 is not null 
    and ACTION_TYPE is not null 
    LTC_SKU_UNIT is a view.
    The following query is used for creating this view.
       SELECT   unit.VK_UNIT,
                unit.MODEL,
                unit.CLASS,
                unit.LOB,
                unit.LAST_UPDATE_DATE,
                unit.DESCRIPTION
         FROM   LTC_GLOBAL.LTC_SKU_UNIT unit;
    The following indexes are created on the LTC_GLOBAL.LTC_SKU_UNIT table.
    CREATE INDEX LTC_GLOBAL.LTC_SKU_UNIT_IDX_CLASS ON LTC_GLOBAL.LTC_SKU_UNIT(CLASS)
    CREATE INDEX LTC_GLOBAL.LTC_SKU_UNIT_IDX_MODEL ON LTC_GLOBAL.LTC_SKU_UNIT(MODEL)
    CREATE INDEX LTC_GLOBAL.LTC_SKU_UNIT_IDX_UPDATE_DATE ON LTC_GLOBAL.LTC_SKU_UNIT(LAST_UPDATE_DATE)
    CREATE UNIQUE INDEX LTC_GLOBAL.LTC_SKU_UNIT_PK ON LTC_GLOBAL.LTC_SKU_UNIT(VK_UNIT, MODEL, CLASS)
    Is there any way to rewrite the query to improve the performance. Any suggestions to improve the performance.
    Please help me.
    Thanks in advance.

  • Peformance fine tunning of query

    Am using co related subquery, please help because it's taking more time when dealing with more number of rows
    below is my sample query.
    SELECT EM.ENTITY_ID,
    EM.ENTITY_DESC,
    EM.UNIT_ID,
    EM.UNIT_DESC,
    EM.OC_ID,
    EM.OC_DESC,
    EM.SBU_ID,
    EM.SBU_DESC,
    EM.COST_CENTRE_ID,
    EM.COST_CENTRE_DESC,
    EM.LOCATION_ID,
    EM.LOCATION_DESC,
    EM.BAND_ID,
    EM.BAND_DESC,
    EM.GRADE_ID,
    EM.GRADE_DESC,
    EM.PSNO,
    EM.EMPLOYEE_ID,
    EM.EMPLOYEE_NAME,
    H.MEDH_CLAIM_TYPE_ID AS CLAIM_TYPE_ID,
    H.MEDH_CLAIM_NO AS CLAIM_NO,
    H.MEDH_CLAIM_DATE AS CLAIM_DATE,
    vCurrencyCode CURRENCY_ID,
    EBC_Fn_Currency_Desc (vCurrencyCode) CURRENCY_DESC,
    Nvl(
    Select
    SUM(NVL (D1.MEDD_CLAIMED_AMOUNT,0))
    From ebcuser.EBC_D_MEDICAL_CLAIM D1 Where H.MEDH_CLAIM_NO = D1.MEDD_CLAIM_NO AND D1.MEDD_DELETED_BY IS NULL
    ,0) AS CLAIM_AMOUNT,
    Nvl(
    Select
    NVL (
    SUM(CASE
    WHEN (D2.MEDD_R_APPROVED_AMOUNT) IS NULL
    THEN
    (D2.MEDD_APPROVED_AMOUNT)
    ELSE
    (D2.MEDD_R_APPROVED_AMOUNT)
    END),
    0.00)
    From ebcuser.EBC_D_MEDICAL_CLAIM D2 Where H.MEDH_CLAIM_NO = D2.MEDD_CLAIM_NO AND D2.MEDD_DELETED_BY IS NULL
    ,0) AS PAYABLE_AMOUNT,
    H.MEDH_CREATED_BY AS CREATED_BY,
    H.MEDH_CREATED_ON AS CREATED_ON,
    H.MEDH_PROCESSED_BY AS PROCESSED_BY,
    H.MEDH_PROCESSED_ON AS PROCESSED_ON,
    H.MEDH_ERA_BATCH_NO AS ERA_BATCH_NO,
    MEDH_QUEUE_STATUS AS ERA_BATCH_STATUS, --Q - Queued for BPV, B - BVP generated, J - JV generated
    EM.EMP_BANK_IFSC_CODE,
    EM.EMP_BANK_ACNO,
    EM.EMP_PAY_MODE,
    EM.EMP_ACTIVE_STATUS,
    H.MEDH_RECEIVED_ON,
    H.MEDH_SCRUTINIZED_ON
    FROM GEN_V_EMPLOYEE_DATA EM,
    EBC_H_MEDICAL_CLAIM H
    WHERE H.MEDH_EMPLOYEE_ID = EM.EMPLOYEE_ID
    AND H.MEDH_PROCESSED_BY IS NOT NULL
    and ( (H.MEDH_ERA_BATCH_NO is not null
    AND (EBCUSER.EBC_FN_PAYMENT_DATE(H.MEDH_ERA_BATCH_NO) BETWEEN vPeriod_From AND vPeriod_Upto) and vType_Tag='P' )
    or
    ( vType_Tag='C' and ( H.MEDH_CLAIM_DATE BETWEEN vPeriod_From AND vPeriod_Upto ) )
    );

    Is there any chance you can move the logic from your function call into the SQL query?
    AND
       EBCUSER.EBC_FN_PAYMENT_DATE(H.MEDH_ERA_BATCH_NO) BETWEEN vPeriod_From AND vPeriod_Upto) and vType_Tag='P'
    )If not, do you high a high degree of repeatably in the data you are passing to the function?
    If so, you may greatly benefit from using scalar subquery caching
    AND
       (select EBCUSER.EBC_FN_PAYMENT_DATE(H.MEDH_ERA_BATCH_NO) from dual)
       BETWEEN vPeriod_From AND vPeriod_Upto) and vType_Tag='P'
    )which you can read about here.
    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8491662046178
    and in many other threads on AskTom.
    Also
    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1547006324238
    may be of some benefit.
    This all assumes that the function call is what is actually causing you problems (perhaps a bad assumption). You should be running a trace (TKPROF or AWR or something) to get an idea of why this query is actually causing you problems.
    Also, as you are new to the forum, please read the FAQ so you learn things like using the tags to preserve the formatting of your code like i did above.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

  • Fine tunning the query which uses /*+ USE_CONCAT */ table hint

    Some of the queries in our application uses the /*+ USE_CONCAT */ table hint which takes huge time for the execution in Oracle database.when we fire the below query in 250Million production database it takes approx.3min for the execution.
    Because of this we are facing a performance issue in the application.
    Below is the sample query :
    SELECT /*+ USE_CONCAT */ * FROM DI_MATCH_KEY WHERE NORM_COUNTRY_CD = 'US'
    AND ((( NORM_CONAME_KEY1 ='WILM I' OR NORM_CONAME_KEY2 = 'WILM I' OR NORM_CONAME_KEY23 = 'WILM I'
    OR NORM_CONAME_KEYFIRST ='WILLIAM' ) AND NORM_STATE_PROVINCE = 'CA' ) OR NORM_ADDR_KEY2 = 'CALMN 12 3 OSAI')
    Regarding the indexes almost for all the columns combination for the above sql index already created in table.
    Your suggestions will be appreciated
    Thanks,
    Regards,
    Krishna kumar

    Hi,
    Thanks for our valuable inputs.
    As suggested find attached explain plan and trace file details in the excel sheet.
    TRACE FILE:
    <pre>
    TKPROF: Release 10.2.0.1.0 - Production on Thu Feb 14 11:11:59 2008
    Copyright (c) 1982, 2005, Oracle. All rights reserved.
    Trace file: implhr01_ora_26457.trc
    Sort options: prsela exeela fchela
    count = number of times OCI procedure was executed
    cpu = cpu time in seconds executing
    elapsed = elapsed time in seconds executing
    disk = number of physical reads of buffers from disk
    query = number of buffers gotten for consistent read
    current = number of buffers gotten in current mode (usually for update)
    rows = number of rows processed by the fetch or execute call
    SELECT /*+ USE_CONCAT */ COUNT(*) FROM DI_MATCH_KEY WHERE NORM_COUNTRY_CD = 'US'
    AND ((( NORM_CONAME_KEY1 ='WILM I' OR NORM_CONAME_KEY2 = 'WILM I' OR NORM_CONAME_KEY23 = 'WILM I'
    OR NORM_CONAME_KEYFIRST ='WILLIAM' ) AND NORM_STATE_PROVINCE = 'CA' ) OR NORM_ADDR_KEY2 = 'CALMN 12 3 OSAI')
    call count cpu elapsed disk query current rows
    Parse 1 0.03 0.05 0 0 0 0
    Execute 1 0.00 0.00 0 0 0 0
    Fetch 2 3.97 65.43 30633 64053 0 1
    total 4 4.00 65.49 30633 64053 0 1
    Misses in library cache during parse: 1
    Optimizer mode: ALL_ROWS
    Parsing user id: 76
    Rows Row Source Operation
    1 SORT AGGREGATE (cr=64053 pr=30633 pw=0 time=65436584 us)
    73914 CONCATENATION (cr=64053 pr=30633 pw=0 time=61623673 us)
    0 TABLE ACCESS BY INDEX ROWID DI_MATCH_KEY (cr=4 pr=2 pw=0 time=32617 us)
    0 INDEX RANGE SCAN MKADDR_KEY2 (cr=4 pr=2 pw=0 time=32599 us)(object id 122583)
    75 TABLE ACCESS BY INDEX ROWID DI_MATCH_KEY (cr=80 pr=20 pw=0 time=1369427 us)
    75 INDEX RANGE SCAN MK_CY_KEY1_ST_PROV (cr=5 pr=0 pw=0 time=2119 us)(object id 122666)
    2 TABLE ACCESS BY INDEX ROWID DI_MATCH_KEY (cr=81 pr=2 pw=0 time=26723 us)
    77 INDEX RANGE SCAN MK_CY_KEY2_ST_PROV (cr=4 pr=0 pw=0 time=3641 us)(object id 122667)
    2 TABLE ACCESS BY INDEX ROWID DI_MATCH_KEY (cr=6 pr=0 pw=0 time=47 us)
    2 INDEX RANGE SCAN MK_CY_KEY1_AGN (cr=4 pr=0 pw=0 time=28 us)(object id 122670)
    73835 TABLE ACCESS BY INDEX ROWID DI_MATCH_KEY (cr=63882 pr=30609 pw=0 time=61503773 us)
    73905 INDEX RANGE SCAN MK_CY_KEY2_AGN (cr=266 pr=176 pw=0 time=148198 us)(object id 122745)
    alter session set sql_trace true
    call count cpu elapsed disk query current rows
    Parse 0 0.00 0.00 0 0 0 0
    Execute 1 0.00 0.00 0 0 0 0
    Fetch 0 0.00 0.00 0 0 0 0
    total 1 0.00 0.00 0 0 0 0
    Misses in library cache during parse: 0
    Misses in library cache during execute: 1
    Optimizer mode: ALL_ROWS
    Parsing user id: 76
    OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
    call count cpu elapsed disk query current rows
    Parse 1 0.03 0.05 0 0 0 0
    Execute 2 0.00 0.00 0 0 0 0
    Fetch 2 3.97 65.43 30633 64053 0 1
    total 5 4.00 65.50 30633 64053 0 1
    Misses in library cache during parse: 1
    Misses in library cache during execute: 1
    OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
    call count cpu elapsed disk query current rows
    Parse 9 0.05 0.03 0 0 0 0
    Execute 23 0.05 0.08 0 0 0 0
    Fetch 98 0.01 0.01 0 137 0 76
    total 130 0.11 0.13 0 137 0 76
    Misses in library cache during parse: 9
    Misses in library cache during execute: 9
    2 user SQL statements in session.
    23 internal SQL statements in session.
    25 SQL statements in session.
    Trace file: implhr01_ora_26457.trc
    Trace file compatibility: 10.01.00
    Sort options: prsela exeela fchela
    1 session in tracefile.
    2 user SQL statements in trace file.
    23 internal SQL statements in trace file.
    25 SQL statements in trace file.
    11 unique SQL statements in trace file.
    561 lines in trace file.
    91 elapsed seconds in trace file.
    </pre>
    EXPLAIN PLAN:
    <pre>
    ID     OPERATION     OBJECT_NAME     CARDINALITY     BYTES     COST     CPU_COST
    0     SELECT STATEMENT          1     53     1886     15753172
    1     SORT          1     53          
    2     CONCATENATION                         
    3     TABLE ACCESS     DI_MATCH_KEY     8     424     10     78334
    4     INDEX     MKADDR_KEY2     8          4     30086
    5     TABLE ACCESS     DI_MATCH_KEY     3     159     7     53574
    6     INDEX     MK_CY_KEY1_ST_PROV     3          4     29286
    7     TABLE ACCESS     DI_MATCH_KEY     3     159     7     53740
    8     INDEX     MK_CY_KEY2_ST_PROV     3          4     29286
    9     TABLE ACCESS     DI_MATCH_KEY     5     265     7     55941
    10     INDEX     MK_CY_KEY1_AGN     5          4     29686
    11     TABLE ACCESS     DI_MATCH_KEY     2192     116176     1855     15511582
    12     INDEX     MK_CY_KEY2_AGN     2228          12     524136
    </pre>
    Kindly help us regarding this.
    Thanks,
    Krishna Kumar.

  • HOW TO FINE TUNE QUERY

    Hi,
    I am having below two queries. 2nd query is taking more time & it gives time out error. Can anybody tell how to fine tune below query. Thanks.
    1st Query.
    SELECT EKETEBELN EKETEBELP EKETETENR EKETEINDT
             EKETMENGE EKETWEMNG
             INTO TABLE I_EKET
             FROM EKET
             WHERE EKETMENGE <> EKETWEMNG
                                             AND
                    EKET~EINDT IN  S_EINDT.
      DESCRIBE TABLE I_EKET LINES V_ZLINES.
      IF V_ZLINES > 0.
    2nd Query.
        SELECT EKKOEBELN EKKOAEDAT EKKOLIFNR EKPOEBELP EKPO~MATNR
               EKPO~WERKS
               EKPOLOEKZ EKPOELIKZ EKPOTXZ01 EKPONETPR LFA1~NAME1
               INTO TABLE I_PODEL
               FROM EKKO
               INNER JOIN EKPO ON EKKOEBELN = EKPOEBELN
               INNER JOIN LFA1 ON EKKOLIFNR = LFA1LIFNR
               FOR ALL ENTRIES IN I_EKET
               WHERE EKKO~EBELN = I_EKET-EBELN AND
                     EKPO~EBELP = I_EKET-EBELP AND
                     EKPO~MATNR IN  S_MATNR AND
                     EKPO~WERKS IN  S_WERKS AND
                     EKPO~WERKS NE 'W001'   AND
                     EKKO~EKORG = P_EKORG   AND
                     EKKO~LIFNR IN S_LIFNR  AND
                     EKKO~LOEKZ NE 'X'      AND
                     EKPO~LOEKZ NE 'S'      AND
                     EKPO~ELIKZ NE 'X'      AND
                     EKPO~LOEKZ NE 'L'      AND
                     EKKO~AEDAT IN  S_AEDAT.
      ELSE.
        WRITE 'No POs found for the selection criteria!'.
      ENDIF.

    Not the right forum to ask this question.
    VJ

  • Help in fine tuning this query

    My query id this,
    select a.event_id,a.document_id
    from sample_transaction a
    where exists (select 1 from sample_transaction b where b.event_id <> a.event_id and b.document_id = a.document_id );
    The execution plan is like this,
    SELECT STATEMENT Cost = 5596
    FILTER
    TABLE ACCESS FULL SAMPLE_TRANSACTION
    TABLE ACCESS BY INDEX ROWID SAMPLE_TRANSACTION
    INDEX RANGE SCAN I_SAMPLE_TRANSACTION_FK_EVT
    There are 6 million records in the table.
    How can i fine tune this query so that i get the results
    Example is
    my table has
    EVENT_ID DOCUMENT_ID
    100 200
    100 200
    101 201
    102 201
    103 203
    104 203
    105 204
    105 204
    106 106
    My result should be
    EVENT_ID DOCUMENT_ID
    101 201
    102 201
    103 203
    104 203
    null

    Based on your select statement, you will bring back every row in sample_transaction where the document is referenced by more than one event. Looking at it another way, the only rows skipped are those where the document is only used by one event.
    The full table scan is not necessarilly a problem since Oracle has to check all rows. You may improve performance if you add an index on document_id. That will allow Oracle to do a better query on the EXISTS clause. Remember to rebuild your statistics after adding the index.

  • Query fine tune.

    Dear All,
    I am using 11g version. The query given below.
    Sample Data:
    Table1: KEY ( It has 4 million records and DUR_UK column is unique key)
    PK
    DUR_UK
    1
    BD|4|J650|01AB|0001LLA|N01005309106|01003014101|0H9ZN|0HB0T|6970189|30748R2|001000
    2
    BD|506001022502|06076001901|0G1GF|0HB0T|7270478|2035772C91|000100
    3
    BD|J08005852109|10004001301|0HB0T|6971058|3551787C91|000100|03-MAY-10|31-DEC-99|3551787C91
    Table2: Section (It has 12k records)
    Column: FVC
    Data: OHBOT
    In table 1, there are 3 types of order for bold and underlined data. I need to get the PK, JVC from KEY table by JOINING with Section table based on bold and underlined field with FVC column.
    I tired with below query but it takes long time and didnt complete. Becoz it go thru 4 million records 3 times.
    SELECT A.PK,B.JVC
      FROM SECTION B
    INNER JOIN KEY A
        ON (REGEXP_SUBSTR(A.DUR_UK,'[^|]+',1,9) = B.FVC OR REGEXP_SUBSTR(A.DUR_UK,'[^|]+',1,5) = B.FVC OR REGEXP_SUBSTR(A.DUR_UK,'[^|]+',1,4) = B.FVC;
    The output could be like.
    PK  JVC
    1     OHBOT
    2     OHBOT
    3     OHBOT
    Can someone please help me out to fine tune.
    Thanks

    Hi,
    In a relational database, each column of each row should contain 1 piece of information, not a delimted list of several items.  This is so basic to database design that it's called First Normal Form.  Relational database are designed to work with data that is in First Normal Form.  Your table was not designed to work well, and it seems to be doing exactly what it was designed for.   This problem (and many others, no doubt) would be much simpler and much faster if each of the |-delimited items was on a separate row.
    If you must use the current design, avoid regular expressions.  You don't need all the power of regular expressions in this problem; you can get the results you need faster using less powerful tools, such as LIKE, INSTR and SUBSTR.
    Depending on your data and your requirements, you might try something like this:
    WITH  got_pos  AS
        SELECT  k.pk, k.dur_uk
        ,       s.jvc, s.fvc
        ,       INSTR (k.dur_uk, '|', 1, 3)  AS pos3
        ,       INSTR (k.dur_uk, '|', 1, 4)  AS pos4
        ,       INSTR (k.dur_uk, '|', 1, 5)  AS pos5
        ,       INSTR (k.dur_uk, '|', 1, 8)  AS pos8
        ,       INSTR (k.dur_uk, '|', 1, 9)  AS pos9
        FROM    section  s
        JOIN    key      k  ON  k.dur_uk  LIKE '%|' || s.fvc || '|%'
    SELECT  pk, jvc
    FROM    got_pos
    WHERE   fvc IN ( SUBSTR (dur_uk, pos3 + 1, pos4 - (pos3 + 1))
                   , SUBSTR (dur_uk, pos4 + 1, pos5 - (pos4 + 1))
                   , SUBSTR (dur_uk, pos8 + 1, pos9 - (pos8 + 1))
    Of course, without any sample data, I can't test this.
    Oracle Text might help with this problem.  I don't use it myself, but I believe it allows you to create indexes so that it's faster to find keywords (such as anyhting in section.fvc) anywhere in large strings (such as key.dur_uk).

  • Help needed to tune the Query:Statistics added

    Can someone DBA please help me to tune this query:
    SELECT DISTINCT K.ATTRIBUTE_VALUE AGENCY_ID,B.PROFILE_NM ,NVL(G.OFFICE_DESC,'--') OFFICE_DESC,f.OFFICE_ID,B.PROFILE_ID,'%' ROLE,'%' LAYOUT,
    CASE
    WHEN 'flagB' = '%' THEN
    NVL(J.ISS_GRP_DESC,'BILLING')
    WHEN 'flagO' = '%' THEN
    NVL(J.ISS_GRP_DESC,'ORDERING')
    WHEN 'flag' = '%' THEN
    NVL(J.ISS_GRP_DESC,'BILLING/ORDERING')
    ELSE
    NVL(J.ISS_GRP_DESC,' ')
    END ISS_GRP_DESC,
    DECODE(NVL(H.USERID,' ') ,' ','--','<a sbcuid_in=' || H.USERID || ' target=NEW >'||H.FIRSTNAME || ' ' || H.LASTNAME || '( ' || H.USERID || ' )</a>' ) USER_NAME
    FROM
    PROFILE_PORTAL B ,
    TBL_BDA_AGENCY_RESP_REP C ,
    TBL_BDA_AGENCY_OFFICE F,
    TBL_BDA_OFFICE G,
    USERS_PORTAL H,
    TBL_BDA_USR_ISS_GRP I ,
    TBL_BDA_ISS_GROUP J,
    ATTRIBUTE_VALUES_PORTAL K,
    PROFILE_TYPE_PORTAL L
    WHERE
    B.PROFILE_ID = F.AGENCY_ID (+)
    AND B.PROFILE_ID = C.AGENCY_ID (+)
    AND G.OFFICE_ID (+)= F.OFFICE_ID
    AND H.USERID (+)= C.RESP_USR_ID
    AND C.ISS_GRP_ID = I.ISS_GRP_ID (+)
    AND I.ISS_GRP_ID = J.ISS_GRP_ID(+)
    AND 'PROFILE.'||B.PROFILE_ID = K.ENTITY_ID(+)
    AND K.ATTRIBUTE_VALUE IS NOT NULL
    AND L.PROFILE_TYPE_ID = B.PROFILE_TYPE_ID
    AND L.APPLICATION_CD='BDA'
    AND NOT EXISTS (SELECT agency_id
    FROM TBL_BDA_AGENCY_RESP_REP t
    WHERE t.ISS_GRP_ID IN ('%')
    AND t.AGENCY_ID = C.AGENCY_ID)
    AND K.ATTRIBUTE_VALUE LIKE '%'
    AND UPPER(B.PROFILE_NM) LIKE UPPER('%')
    AND (to_char(NVL(B.PROFILE_ID,0)) LIKE '%' OR NVL(B.PROFILE_ID,0) IN ('a'))
    AND NVL(G.OFFICE_ID,0) IN ('%')
    AND (to_char(NVL(C.RESP_USR_ID,'0')) LIKE '%' OR NVL(C.RESP_USR_ID,'0') IN ('k'))
    ORDER BY PROFILE_NM
    The number of rows in these tables are as follows:
    PROFILE_PORTAL -- 2392
    TBL_BDA_AGENCY_RESP_REP 3508
    TBL_BDA_AGENCY_OFFICE 2151
    TBL_BDA_OFFICE 3
    USERS_PORTAL 270500
    TBL_BDA_USR_ISS_GRP 234
    TBL_BDA_ISS_GROUP 2
    ATTRIBUTE_VALUES_PORTAL 2790
    PROFILE_TYPE_PORTAL 3
    The Explain pal nhas given this o/p to me:
    SQL> select * from table(dbms_xplan.display) dual;
    PLAN_TABLE_OUTPUT
    | Id | Operation | Name | Rows | Bytes |TempSpc| Cost |
    | 0 | SELECT STATEMENT | | 807 | 102K| | 2533 |
    | 1 | SORT UNIQUE | | 807 | 102K| 232K| 82 |
    |* 2 | FILTER | | | | | |
    |* 3 | HASH JOIN OUTER | | 807 | 102K| | 52 |
    |* 4 | HASH JOIN OUTER | | 807 | 95226 | | 40 |
    |* 5 | TABLE ACCESS BY INDEX ROWID | ATTRIBUTE_VALUES | 1 | 23 | | 2 |
    | 6 | NESTED LOOPS | | 7 | 805 | | 37 |
    | 7 | NESTED LOOPS OUTER | | 6 | 552 | | 25 |
    |* 8 | FILTER | | | | | |
    | 9 | NESTED LOOPS OUTER | | | | | |
    |* 10 | FILTER | | | | | |
    | 11 | NESTED LOOPS OUTER | | | | | |
    | 12 | NESTED LOOPS OUTER | | 3 | 141 | | 10 |
    |* 13 | HASH JOIN | | 3 | 120 | | 7 |
    |* 14 | TABLE ACCESS FULL | PROFILE | 6 | 198 | | 4 |
    |* 15 | TABLE ACCESS FULL | PROFILE_TYPE | 1 | 7 | | 2 |
    |* 16 | INDEX RANGE SCAN | SYS_C0019777 | 1 | 7 | | 1 |
    | 17 | TABLE ACCESS BY INDEX ROWID| TBL_BDA_OFFICE | 1 | 10 | | 1 |
    |* 18 | INDEX UNIQUE SCAN | SYS_C0019800 | 1 | | | |
    | 19 | TABLE ACCESS BY INDEX ROWID | TBL_BDA_AGENCY_RESP_REP | 2 | 26 | | 2 |
    |* 20 | INDEX RANGE SCAN | IDX_AGECYRESP_AGNCYID | 2 | | | 1 |
    | 21 | TABLE ACCESS BY INDEX ROWID | USER_ | 1 | 22 | | 1 |
    |* 22 | INDEX UNIQUE SCAN | USER_PK | 1 | | | |
    |* 23 | INDEX RANGE SCAN | IDX_ATTVAL_ENTATTID | 1 | | | 1 |
    | 24 | TABLE ACCESS FULL | TBL_BDA_USR_ISS_GRP | 234 | 702 | | 2 |
    | 25 | TABLE ACCESS FULL | TBL_BDA_ISS_GROUP | 2 | 24 | | 2 |
    |* 26 | TABLE ACCESS BY INDEX ROWID | TBL_BDA_AGENCY_RESP_REP | 1 | 7 | | 3 |
    |* 27 | INDEX RANGE SCAN | IDX_AGECYRESP_AGNCYID | 2 | | | 1 |
    Predicate Information (identified by operation id):
    2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "TBL_BDA_AGENCY_RESP_REP" "T" WHERE "T"."AGENCY_ID"=:B1
    AND "T"."ISS_GRP_ID"=TO_NUMBER('%')))
    3 - access("I"."ISS_GRP_ID"="J"."ISS_GRP_ID"(+))
    4 - access("SYS_ALIAS_1"."ISS_GRP_ID"="I"."ISS_GRP_ID"(+))
    5 - filter("K"."ATTRIBUTE_VALUE" IS NOT NULL AND "K"."ATTRIBUTE_VALUE" LIKE '%')
    8 - filter(NVL("SYS_ALIAS_1"."RESP_USR_ID",'0') LIKE '%' OR NVL("SYS_ALIAS_1"."RESP_USR_ID",'0')='k')
    10 - filter(NVL("G"."OFFICE_ID",0)=TO_NUMBER('%'))
    13 - access("L"."PROFILE_TYPE_ID"="B"."PROFILE_TYPE_ID")
    14 - filter(UPPER("B"."PROFILE_NM") LIKE '%' AND (TO_CHAR(NVL("B"."PROFILE_ID",0)) LIKE '%' OR
    NVL("B"."PROFILE_ID",0)=TO_NUMBER('a')))
    15 - filter("L"."APPLICATION_CD"='BDA')
    16 - access("B"."PROFILE_ID"="F"."AGENCY_ID"(+))
    18 - access("G"."OFFICE_ID"(+)="F"."OFFICE_ID")
    20 - access("B"."PROFILE_ID"="SYS_ALIAS_1"."AGENCY_ID"(+))
    22 - access("H"."USERID"(+)="SYS_ALIAS_1"."RESP_USR_ID")
    23 - access("K"."ENTITY_ID"='PROFILE.'||TO_CHAR("B"."PROFILE_ID"))
    26 - filter("T"."ISS_GRP_ID"=TO_NUMBER('%'))
    27 - access("T"."AGENCY_ID"=:B1)
    Note: cpu costing is off
    57 rows selected.
    Elapsed: 00:00:01.08
    Please help me.
    Aashish S.

    Hello Eric,
    Here is the code:
    SELECT DISTINCT
    K.ATTRIBUTE_VALUE AGENCY_ID,
    B.PROFILE_NM ,
    NVL(G.OFFICE_DESC,'--') OFFICE_DESC,
    f.OFFICE_ID,
    B.PROFILE_ID,
    '%' ROLE,
    '%' LAYOUT,
    case
    WHEN 'flagB' = '%' THEN
    NVL(J.ISS_GRP_DESC,'BILLING')
    WHEN 'flagO' = '%' THEN
    NVL(J.ISS_GRP_DESC,'ORDERING')
    WHEN 'flag' = '%' THEN
    NVL(J.ISS_GRP_DESC,'BILLING/ORDERING')
    else
    NVL(J.ISS_GRP_DESC,' ')
    END ISS_GRP_DESC,
    DECODE(NVL(H.USERID,' ') ,' ','--','&lt;a sbcuid_in=' || H.USERID || ' target=NEW &gt;'||H.FIRSTNAME || ' ' || H.LASTNAME ||
    '( ' || H.USERID || ' )&lt;/a&gt;' ) USER_NAME
    from
    PROFILE_PORTAL B ,
    TBL_BDA_AGENCY_RESP_REP C ,
    TBL_BDA_AGENCY_OFFICE F,
    TBL_BDA_OFFICE G,
    USERS_PORTAL H,
    TBL_BDA_USR_ISS_GRP I ,
    TBL_BDA_ISS_GROUP J,
    ATTRIBUTE_VALUES_PORTAL K,
    PROFILE_TYPE_PORTAL L
    WHERE
    B.PROFILE_ID = F.AGENCY_ID (+)
    AND B.PROFILE_ID = C.AGENCY_ID (+)
    AND G.OFFICE_ID (+)= F.OFFICE_ID
    AND H.USERID (+)= C.RESP_USR_ID
    AND C.ISS_GRP_ID = I.ISS_GRP_ID (+)
    AND I.ISS_GRP_ID = J.ISS_GRP_ID(+)
    AND 'PROFILE.'||B.PROFILE_ID = K.ENTITY_ID(+)
    AND K.ATTRIBUTE_VALUE IS NOT NULL
    AND L.PROFILE_TYPE_ID = B.PROFILE_TYPE_ID
    AND L.APPLICATION_CD='BDA'
    AND NOT EXISTS
    (SELECT agency_id
    FROM TBL_BDA_AGENCY_RESP_REP t
    WHERE t.ISS_GRP_ID IN (1)
    AND t.AGENCY_ID = C.AGENCY_ID)
    AND K.ATTRIBUTE_VALUE LIKE '%'
    AND UPPER(B.PROFILE_NM) LIKE UPPER('%')
    AND (to_char(NVL(B.PROFILE_ID,0))
    LIKE '%'
    OR NVL(B.PROFILE_ID,0) IN (1))
    AND NVL(G.OFFICE_ID,0) IN (1)
    AND (to_char(NVL(C.RESP_USR_ID,'0'))
    LIKE '%'
    OR NVL(C.RESP_USR_ID,'0') IN ('%'))
    ORDER BY PROFILE_NM
    This is the Query and the query takes some mins. to run in prod environment.
    From the Query plan ,I am not able to get any idea for optimization.
    Now,Can you tell me which steps I need to follow to run it faster and which all modifications should be made?
    Thanks.
    Aashish S.

  • Need to tune insert query

    Hi,
    I'm using below query inside the procedure.I need to tune this query as it is taking more time for execution.Could you some help on this
    *version.*
    10.2.0
    Query
    INSERT INTO  TEMP_TEST_STAT(
                SELECT S.STUDENT_ID_PK, A.RESPONSE_KEY GENDER, B.RESPONSE_KEY ETHNICITY, T.SCORE SCALE_SCORE ,D.TEST_NAME
                FROM TEST_SESSION_DETAIL T, TEST_SESSION S, STUDENT U, TEST_DETAIL D,
                SELECT I.ITEM_ID, I.UIN, BG.BG_SESSION_DETAIL_ID, BG.RESPONSE_KEY , B.TEST_SESSION_ID, C.STUDENT_ID_PK
                FROM BG_QUESTION_USER_RESPONSE BG, ITEM I, BG_SESSION_DETAIL B, TEST_SESSION C
                WHERE
                BG.ITEM_ID = I.ITEM_ID AND I.UIN = 'SBG002' AND
                BG.BG_SESSION_DETAIL_ID = B.BG_SESSION_DETAIL_ID
                AND B.TEST_SESSION_ID = C.TEST_SESSION_ID ) A,
                SELECT I.ITEM_ID, I.UIN, BG.BG_SESSION_DETAIL_ID, BG.RESPONSE_KEY , B.TEST_SESSION_ID, C.STUDENT_ID_PK
                FROM BG_QUESTION_USER_RESPONSE BG, ITEM I, BG_SESSION_DETAIL B, TEST_SESSION C
                WHERE
                BG.ITEM_ID = I.ITEM_ID AND I.UIN = 'SBG001' AND
                BG.BG_SESSION_DETAIL_ID = B.BG_SESSION_DETAIL_ID
                AND B.TEST_SESSION_ID = C.TEST_SESSION_ID ) B
                ,INSTITUTION E
                WHERE
                D.TEST_NAME = 'Reading Comprehension' AND
                T.TEST_SESSION_STATUS_ID = 3
                AND TRUNC(T.TEST_END_DATE) BETWEEN TO_DATE('01-09-09','DD-MON-YY') AND TO_DATE('30-09-09','DD-MON-YY')
                AND T.TEST_DETAIL_ID = D.TEST_DETAIL_ID
                AND S.STUDENT_ID_PK = U.STUDENT_ID_PK
                AND S.TEST_SESSION_ID = T.TEST_SESSION_ID
                AND A.TEST_SESSION_ID = T.TEST_SESSION_ID
                AND A.STUDENT_ID_PK = S.STUDENT_ID_PK
                AND B.TEST_SESSION_ID = T.TEST_SESSION_ID
                AND B.STUDENT_ID_PK = S.STUDENT_ID_PK
                AND S.INSTITUTION_ID=E.INSTITUTION_ID
                AND SUBSTR(E.INSTITUTION_ID_DISPLAY,8,3) <> '000');
    Explain plan
    PLAN_TABLE_OUTPUT
    Plan hash value: 790379856
    | Id  | Operation                                      | Name                         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
    |   0 | INSERT STATEMENT                               |                              |     1 |   204 |  1567   (1)| 00:00:19 |       |       |
    |*  1 |  FILTER                                        |                              |       |       |            |          |       |       |
    |   2 |   NESTED LOOPS                                 |                              |     1 |   204 |  1567   (1)| 00:00:19 |       |       |
    |   3 |    NESTED LOOPS                                |                              |     1 |   189 |  1566   (1)| 00:00:19 |       |       |
    |   4 |     NESTED LOOPS                               |                              |     1 |   167 |  1561   (1)| 00:00:19 |       |       |
    |   5 |      NESTED LOOPS                              |                              |     1 |   155 |  1560   (1)| 00:00:19 |       |       |
    |   6 |       NESTED LOOPS                             |                              |     1 |   143 |  1556   (1)| 00:00:19 |       |       |
    |   7 |        NESTED LOOPS                            |                              |     1 |   128 |  1555   (1)| 00:00:19 |       |       |
    |   8 |         NESTED LOOPS                           |                              |     1 |   106 |  1550   (1)| 00:00:19 |       |       |
    |   9 |          NESTED LOOPS                          |                              |   186 | 17484 |  1364   (1)| 00:00:17 |       |       |
    |* 10 |           HASH JOIN                            |                              |    86 |  7052 |  1020   (1)| 00:00:13 |       |       |
    |  11 |            NESTED LOOPS                        |                              |    86 |  5848 |  1002   (1)| 00:00:13 |       |       |
    |* 12 |             HASH JOIN                          |                              |    86 |  4472 |   916   (1)| 00:00:11 |       |       |
    |* 13 |              INDEX RANGE SCAN                  | TEST_DETAIL_AK_1             |     1 |    21 |     2   (0)| 00:00:01 |       |       |
    |* 14 |              TABLE ACCESS BY GLOBAL INDEX ROWID| TEST_SESSION_DETAIL          |  8549 |   258K|   914   (1)| 00:00:11 | ROWID | ROWID |
    |* 15 |               INDEX RANGE SCAN                 | TEST_END_DATE_IDX            | 15672 |       |    53   (0)| 00:00:01 |       |       |
    |  16 |             PARTITION HASH ITERATOR            |                              |     1 |    16 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |  17 |              TABLE ACCESS BY LOCAL INDEX ROWID | TEST_SESSION                 |     1 |    16 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 18 |               INDEX UNIQUE SCAN                | PK_TEST_SESSION              |     1 |       |     0   (0)| 00:00:01 |   KEY |   KEY |
    |* 19 |            INDEX FAST FULL SCAN                | INSTI_ID_NAME_COUN_DISP_IDX  |  5930 | 83020 |    17   (0)| 00:00:01 |       |       |
    |  20 |           TABLE ACCESS BY GLOBAL INDEX ROWID   | BG_SESSION_DETAIL            |     2 |    24 |     4   (0)| 00:00:01 | ROWID | ROWID |
    |* 21 |            INDEX RANGE SCAN                    | BG_SESS_DETAIL_TEST_SE_FK1_I |     2 |       |     2   (0)| 00:00:01 |       |       |
    |  22 |          PARTITION HASH ITERATOR               |                              |     1 |    12 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 23 |           TABLE ACCESS BY LOCAL INDEX ROWID    | TEST_SESSION                 |     1 |    12 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 24 |            INDEX UNIQUE SCAN                   | PK_TEST_SESSION              |     1 |       |     0   (0)| 00:00:01 |   KEY |   KEY |
    |  25 |         TABLE ACCESS BY GLOBAL INDEX ROWID     | BG_QUESTION_USER_RESPONSE    |     4 |    88 |     5   (0)| 00:00:01 | ROWID | ROWID |
    |* 26 |          INDEX RANGE SCAN                      | BG_QUESTION_USER_RESP_IDX1   |     4 |       |     2   (0)| 00:00:01 |       |       |
    |  27 |        PARTITION HASH ITERATOR                 |                              |     1 |    15 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 28 |         TABLE ACCESS BY LOCAL INDEX ROWID      | ITEM                         |     1 |    15 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 29 |          INDEX UNIQUE SCAN                     | PK_ITEM                      |     1 |       |     0   (0)| 00:00:01 |   KEY |   KEY |
    |  30 |       TABLE ACCESS BY GLOBAL INDEX ROWID       | BG_SESSION_DETAIL            |     2 |    24 |     4   (0)| 00:00:01 | ROWID | ROWID |
    |* 31 |        INDEX RANGE SCAN                        | BG_SESS_DETAIL_TEST_SE_FK1_I |     2 |       |     2   (0)| 00:00:01 |       |       |
    |  32 |      PARTITION HASH ITERATOR                   |                              |     1 |    12 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 33 |       TABLE ACCESS BY LOCAL INDEX ROWID        | TEST_SESSION                 |     1 |    12 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 34 |        INDEX UNIQUE SCAN                       | PK_TEST_SESSION              |     1 |       |     0   (0)| 00:00:01 |   KEY |   KEY |
    |  35 |     TABLE ACCESS BY GLOBAL INDEX ROWID         | BG_QUESTION_USER_RESPONSE    |     4 |    88 |     5   (0)| 00:00:01 | ROWID | ROWID |
    |* 36 |      INDEX RANGE SCAN                          | BG_QUESTION_USER_RESP_IDX1   |     4 |       |     2   (0)| 00:00:01 |       |       |
    |  37 |    PARTITION HASH ITERATOR                     |                              |     1 |    15 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 38 |     TABLE ACCESS BY LOCAL INDEX ROWID          | ITEM                         |     1 |    15 |     1   (0)| 00:00:01 |   KEY |   KEY |
    |* 39 |      INDEX UNIQUE SCAN                         | PK_ITEM                      |     1 |       |     0   (0)| 00:00:01 |   KEY |   KEY |
    Predicate Information (identified by operation id):
       1 - filter(TO_DATE('01-09-09','DD-MON-YY')<=TO_DATE('30-09-09','DD-MON-YY'))
      10 - access("S"."INSTITUTION_ID"="E"."INSTITUTION_ID")
      12 - access("T"."TEST_DETAIL_ID"="D"."TEST_DETAIL_ID")
      13 - access("D"."TEST_NAME"='Reading Comprehension')
      14 - filter("T"."TEST_SESSION_STATUS_ID"=3)
      15 - access(TRUNC(INTERNAL_FUNCTION("TEST_END_DATE"))>=TO_DATE('01-09-09','DD-MON-YY') AND
                  TRUNC(INTERNAL_FUNCTION("TEST_END_DATE"))<=TO_DATE('30-09-09','DD-MON-YY'))
      18 - access("S"."TEST_SESSION_ID"="T"."TEST_SESSION_ID")
      19 - filter(SUBSTR("E"."INSTITUTION_ID_DISPLAY",8,3)<>'000')
      21 - access("B"."TEST_SESSION_ID"="T"."TEST_SESSION_ID")
      23 - filter("C"."STUDENT_ID_PK"="S"."STUDENT_ID_PK")
      24 - access("B"."TEST_SESSION_ID"="C"."TEST_SESSION_ID")
      26 - access("BG"."BG_SESSION_DETAIL_ID"="B"."BG_SESSION_DETAIL_ID")
      28 - filter("I"."UIN"='SBG001')
      29 - access("BG"."ITEM_ID"="I"."ITEM_ID")
      31 - access("B"."TEST_SESSION_ID"="T"."TEST_SESSION_ID")
      33 - filter("C"."STUDENT_ID_PK"="S"."STUDENT_ID_PK")
      34 - access("B"."TEST_SESSION_ID"="C"."TEST_SESSION_ID")
      36 - access("BG"."BG_SESSION_DETAIL_ID"="B"."BG_SESSION_DETAIL_ID")
      38 - filter("I"."UIN"='SBG002')
      39 - access("BG"."ITEM_ID"="I"."ITEM_ID")

    Rob,
    How i can my insert statement here.
    I tried like..but error.
    select /*+ gather_plan_statistics */  INSERT INTO  TEMP_TEST_STAT(
                SELECT S.STUDENT_ID_PK, A.RESPONSE_KEY GENDER, B.RESPONSE_KEY ETHNICITY, T.SCORE SCALE_SCORE ,D.TEST_NAME
                FROM TEST_SESSION_DETAIL T, TEST_SESSION S, STUDENT U, TEST_DETAIL D,
                SELECT I.ITEM_ID, I.UIN, BG.BG_SESSION_DETAIL_ID, BG.RESPONSE_KEY , B.TEST_SESSION_ID, C.STUDENT_ID_PK
                FROM BG_QUESTION_USER_RESPONSE BG, ITEM I, BG_SESSION_DETAIL B, TEST_SESSION C
                WHERE
                BG.ITEM_ID = I.ITEM_ID AND I.UIN = 'SBG002' AND
                BG.BG_SESSION_DETAIL_ID = B.BG_SESSION_DETAIL_ID
                AND B.TEST_SESSION_ID = C.TEST_SESSION_ID ) A,
                SELECT I.ITEM_ID, I.UIN, BG.BG_SESSION_DETAIL_ID, BG.RESPONSE_KEY , B.TEST_SESSION_ID, C.STUDENT_ID_PK
                FROM BG_QUESTION_USER_RESPONSE BG, ITEM I, BG_SESSION_DETAIL B, TEST_SESSION C
                WHERE
                BG.ITEM_ID = I.ITEM_ID AND I.UIN = 'SBG001' AND
                BG.BG_SESSION_DETAIL_ID = B.BG_SESSION_DETAIL_ID
                AND B.TEST_SESSION_ID = C.TEST_SESSION_ID ) B
                ,INSTITUTION E
                WHERE
                D.TEST_NAME = 'Reading Comprehension' AND
                T.TEST_SESSION_STATUS_ID = 3
                AND TRUNC(T.TEST_END_DATE) BETWEEN TO_DATE('01-09-09','DD-MON-YY') AND TO_DATE('30-09-09','DD-MON-YY')
                AND T.TEST_DETAIL_ID = D.TEST_DETAIL_ID
                AND S.STUDENT_ID_PK = U.STUDENT_ID_PK
                AND S.TEST_SESSION_ID = T.TEST_SESSION_ID
                AND A.TEST_SESSION_ID = T.TEST_SESSION_ID
                AND A.STUDENT_ID_PK = S.STUDENT_ID_PK
                AND B.TEST_SESSION_ID = T.TEST_SESSION_ID
                AND B.STUDENT_ID_PK = S.STUDENT_ID_PK
                AND S.INSTITUTION_ID=E.INSTITUTION_ID
                AND SUBSTR(E.INSTITUTION_ID_DISPLAY,8,3)  '000') from dual;please advice

  • Fine tune Query

    Hi , I would like to ask the expert here..how could i fine tune the below query..now it return data within 60 seconds. however my client require the data should return <5 second
    SELECT DECODE (CURR.START_DATE, '', PREV.START_DATE, CURR.START_DATE) START_DATE,
    DECODE (CURR.START_HOUR, '', PREV.START_HOUR, CURR.START_HOUR) START_HOUR,
    DECODE (CURR.IN_PARTNER, '', PREV.IN_PARTNER, CURR.IN_PARTNER) IN_PARTNER,
    DECODE (CURR.OUT_PARTNER, '', PREV.OUT_PARTNER, CURR.OUT_PARTNER) OUT_PARTNER,
    DECODE (CURR.SUBSCRIBER_TYPE, '', PREV.SUBSCRIBER_TYPE, CURR.SUBSCRIBER_TYPE) SUBSCRIBER_TYPE,
    DECODE (CURR.TRAFFIC_TYPE, '', PREV.TRAFFIC_TYPE, CURR.TRAFFIC_TYPE) TRAFFIC_TYPE,
    DECODE (CURR.EVENT_TYPE, '', PREV.EVENT_TYPE, CURR.EVENT_TYPE) EVENT_TYPE,
    DECODE (CURR.INTERVAL_PERIOD, '', PREV.INTERVAL_PERIOD, CURR.INTERVAL_PERIOD) INTERVAL_PERIOD,
    --DECODE (CURR.THRESHOLD, '', PREV.THRESHOLD, CURR.THRESHOLD) THRESHOLD,
    DECODE (CURR.CALLED_NO_GRP, '', PREV.CALLED_NO_GRP, CURR.CALLED_NO_GRP) CALLED_NO_GRP,
    SUM (DECODE (CURR.EVENT_COUNT, '', 0, CURR.EVENT_COUNT)) EVENT_COUNT,
    --SUM (DECODE (CURR.EVENT_DURATION, '', 0, CURR.EVENT_DURATION)) EVENT_DURATION,
    --SUM (DECODE (CURR.DATA_VOLUME, '', 0, CURR.DATA_VOLUME)) DATA_VOLUME,
    --AVG (DECODE (CURR.AVERAGE_DURATION, '', 0, CURR.AVERAGE_DURATION)) AVERAGE_DURATION,
    SUM (DECODE (PREV.EVENT_COUNT_PREV, '', 0, PREV.EVENT_COUNT_PREV)) EVENT_COUNT_PREV,
    --SUM ( DECODE (PREV.EVENT_DURATION_PREV, '', 0, PREV.EVENT_DURATION_PREV)) EVENT_DURATION_PREV,
    --SUM (DECODE (PREV.DATA_VOLUME_PREV, '', 0, PREV.DATA_VOLUME_PREV)) DATA_VOLUME_PREV,
    --AVG ( DECODE (PREV.AVERAGE_DURATION_PREV, '', 0, PREV.AVERAGE_DURATION_PREV)) AVERAGE_DURATION_PREV,
    ABS ( SUM (DECODE (CURR.EVENT_COUNT, '', 0, CURR.EVENT_COUNT)) - SUM ( DECODE (PREV.EVENT_COUNT_PREV, '', 0, PREV.EVENT_COUNT_PREV))) EVENT_COUNT_DIFF
    FROM ------------------------------- CURR
    (SELECT START_DATE,
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    --rd_thr.param_value THRESHOLD,
    rd.param_value INTERVAL_PERIOD,
    CALLED_NO_GRP,
    --SUM (DATA_VOLUME)                                                                                                                       AS DATA_VOLUME,
    --SUM (EVENT_DURATION)                                                                                                                    AS EVENT_DURATION,
    --DECODE ( SUM (NVL (EVENT_COUNT / 1000000, 0)), 0, 0, ROUND ( SUM (EVENT_DURATION / 1000000) / SUM (NVL (EVENT_COUNT / 1000000, 0)), 2)) AS AVERAGE_DURATION,
    SUM (EVENT_COUNT) AS EVENT_COUNT
    FROM MSC_OUT_AGG,
    raid_t_parameters rd,
    raid_t_parameters rd_min,
    raid_t_parameters rd_max,
    raid_t_parameters rd_thr
    WHERE TRUNC (SYSDATE - TO_DATE (START_DATE, 'YYYYMMDD')) <= rd_min.param_value
    AND rd_min.param_id = 'histMD_IN_MSC'
    AND rd_min.param_id2 = 'DASHBOARD_THRESHOLD_MIN'
    AND rd.param_id = 'histMD_IN_MSC'
    AND rd.param_id2 = 'INTERVAL_PERIOD'
    AND rd_max.param_id = 'histMD_IN_MSC'
    AND rd_max.param_id2 = 'DASHBOARD_THRESHOLD_MAX'
    AND rd_thr.param_id = 'histMD_IN_MSC'
    AND rd_thr.param_id2 = 'PER_THRESHOLD_W'
    AND TO_DATE (START_DATE, 'YYYYMMDD') < SYSDATE - rd_max.param_value
    AND SOURCE = 'MD_IN_MSC_HUA'
    GROUP BY START_DATE,
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    rd.param_value,
    CALLED_NO_GRP,
    rd_thr.param_value
    ) CURR
    FULL OUTER JOIN
    ---------------------------------- PREV --------------------------
    SELECT TO_CHAR ( TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD')), 'YYYYMMDD') START_DATE,
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    rd.param_value INTERVAL_PERIOD,
    CALLED_NO_GRP,
    --rd_thr.param_value THRESHOLD,
    SUM (EVENT_COUNT) AS EVENT_COUNT_PREV
    --SUM (EVENT_DURATION)                                                                                                                    AS EVENT_DURATION_PREV,
    --DECODE ( SUM (NVL (EVENT_COUNT / 1000000, 0)), 0, 0, ROUND ( SUM (EVENT_DURATION / 1000000) / SUM (NVL (EVENT_COUNT / 1000000, 0)), 2)) AS AVERAGE_DURATION_PREV,
    --SUM (DATA_VOLUME)                                                                                                                       AS DATA_VOLUME_PREV
    FROM MSC_OUT_AGG,
    raid_t_parameters rd,
    raid_t_parameters rd_min,
    raid_t_parameters rd_max,
    raid_t_parameters rd_thr
    WHERE TRUNC ( SYSDATE - TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD'))) <= rd_min.param_value
    AND rd.param_id = 'histMD_IN_MSC'
    AND rd.param_id2 = 'INTERVAL_PERIOD'
    AND rd_min.param_id = 'histMD_IN_MSC'
    AND rd_min.param_id2 = 'DASHBOARD_THRESHOLD_MIN'
    AND rd_max.param_id = 'histMD_IN_MSC'
    AND rd_max.param_id2 = 'DASHBOARD_THRESHOLD_MAX'
    AND rd_thr.param_id = 'histMD_IN_MSC'
    AND rd_thr.param_id2 = 'PER_THRESHOLD_W'
    AND TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD')) < SYSDATE - rd_max.param_value
    AND SOURCE = 'MD_IN_MSC_HUA'
    GROUP BY TO_CHAR ( TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD')), 'YYYYMMDD'),
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    rd.param_value,
    CALLED_NO_GRP,
    rd_thr.param_value
    ) PREV
    -------------------------- join ------------------
    ON ( CURR.START_DATE = PREV.START_DATE
    AND CURR.START_HOUR = PREV.START_HOUR
    AND CURR.IN_PARTNER = PREV.IN_PARTNER
    AND CURR.OUT_PARTNER = PREV.OUT_PARTNER
    AND CURR.SUBSCRIBER_TYPE = PREV.SUBSCRIBER_TYPE
    AND CURR.TRAFFIC_TYPE = PREV.TRAFFIC_TYPE
    AND CURR.INTERVAL_PERIOD = PREV.INTERVAL_PERIOD
    --AND CURR.THRESHOLD        = PREV.THRESHOLD
    AND CURR.EVENT_TYPE = PREV.EVENT_TYPE
    AND CURR.CALLED_NO_GRP = PREV.CALLED_NO_GRP)
    GROUP BY DECODE (CURR.START_DATE, '', PREV.START_DATE, CURR.START_DATE),
    DECODE (CURR.START_HOUR, '', PREV.START_HOUR, CURR.START_HOUR),
    DECODE (CURR.IN_PARTNER, '', PREV.IN_PARTNER, CURR.IN_PARTNER),
    DECODE (CURR.OUT_PARTNER, '', PREV.OUT_PARTNER, CURR.OUT_PARTNER),
    DECODE (CURR.SUBSCRIBER_TYPE, '', PREV.SUBSCRIBER_TYPE, CURR.SUBSCRIBER_TYPE),
    DECODE (CURR.TRAFFIC_TYPE, '', PREV.TRAFFIC_TYPE, CURR.TRAFFIC_TYPE),
    DECODE (CURR.INTERVAL_PERIOD, '', PREV.INTERVAL_PERIOD, CURR.INTERVAL_PERIOD),
    --DECODE (CURR.THRESHOLD, '', PREV.THRESHOLD, CURR.THRESHOLD),
    DECODE (CURR.EVENT_TYPE, '', PREV.EVENT_TYPE, CURR.EVENT_TYPE),
    DECODE (CURR.CALLED_NO_GRP, '', PREV.CALLED_NO_GRP, CURR.CALLED_NO_GRP);
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    I changed to query as below, however the performance not much difference compare to original
    WITH CURR AS
    SELECT /*+ MATERIALIZE */ START_DATE,
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    --rd_thr.param_value THRESHOLD,
    rd.param_value INTERVAL_PERIOD,
    CALLED_NO_GRP,
    --SUM (DATA_VOLUME)                                                                                                                       AS DATA_VOLUME,
    --SUM (EVENT_DURATION)                                                                                                                    AS EVENT_DURATION,
    --DECODE ( SUM (NVL (EVENT_COUNT / 1000000, 0)), 0, 0, ROUND ( SUM (EVENT_DURATION / 1000000) / SUM (NVL (EVENT_COUNT / 1000000, 0)), 2)) AS AVERAGE_DURATION,
    SUM (EVENT_COUNT) AS EVENT_COUNT
    FROM MSC_OUT_AGG,
    raid_t_parameters rd,
    raid_t_parameters rd_min,
    raid_t_parameters rd_max,
    raid_t_parameters rd_thr
    WHERE TRUNC (SYSDATE - TO_DATE (START_DATE, 'YYYYMMDD')) <= rd_min.param_value
    AND rd_min.param_id = 'histMD_IN_MSC'
    AND rd_min.param_id2 = 'DASHBOARD_THRESHOLD_MIN'
    AND rd.param_id = 'histMD_IN_MSC'
    AND rd.param_id2 = 'INTERVAL_PERIOD'
    AND rd_max.param_id = 'histMD_IN_MSC'
    AND rd_max.param_id2 = 'DASHBOARD_THRESHOLD_MAX'
    AND rd_thr.param_id = 'histMD_IN_MSC'
    AND rd_thr.param_id2 = 'PER_THRESHOLD_W'
    AND TO_DATE (START_DATE, 'YYYYMMDD') < SYSDATE - rd_max.param_value
    AND SOURCE = 'MD_IN_MSC_HUA'
    GROUP BY START_DATE,
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    rd.param_value,
    CALLED_NO_GRP,
    rd_thr.param_value
    ), PREV AS
    SELECT /*+ MATERIALIZE */ TO_CHAR ( TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD')), 'YYYYMMDD') START_DATE,
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    rd.param_value INTERVAL_PERIOD,
    CALLED_NO_GRP,
    --rd_thr.param_value THRESHOLD,
    SUM (EVENT_COUNT) AS EVENT_COUNT_PREV
    --SUM (EVENT_DURATION)                                                                                                                    AS EVENT_DURATION_PREV,
    --DECODE ( SUM (NVL (EVENT_COUNT / 1000000, 0)), 0, 0, ROUND ( SUM (EVENT_DURATION / 1000000) / SUM (NVL (EVENT_COUNT / 1000000, 0)), 2)) AS AVERAGE_DURATION_PREV,
    --SUM (DATA_VOLUME)                                                                                                                       AS DATA_VOLUME_PREV
    FROM MSC_OUT_AGG,
    raid_t_parameters rd,
    raid_t_parameters rd_min,
    raid_t_parameters rd_max,
    raid_t_parameters rd_thr
    WHERE TRUNC ( SYSDATE - TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD'))) <= rd_min.param_value
    AND rd.param_id = 'histMD_IN_MSC'
    AND rd.param_id2 = 'INTERVAL_PERIOD'
    AND rd_min.param_id = 'histMD_IN_MSC'
    AND rd_min.param_id2 = 'DASHBOARD_THRESHOLD_MIN'
    AND rd_max.param_id = 'histMD_IN_MSC'
    AND rd_max.param_id2 = 'DASHBOARD_THRESHOLD_MAX'
    AND rd_thr.param_id = 'histMD_IN_MSC'
    AND rd_thr.param_id2 = 'PER_THRESHOLD_W'
    AND TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD')) < SYSDATE - rd_max.param_value
    AND SOURCE = 'MD_IN_MSC_HUA'
    GROUP BY TO_CHAR ( TRUNC ( rd.param_value + TO_DATE (START_DATE, 'YYYYMMDD')), 'YYYYMMDD'),
    START_HOUR,
    IN_PARTNER,
    OUT_PARTNER,
    SUBSCRIBER_TYPE,
    TRAFFIC_TYPE,
    EVENT_TYPE,
    rd.param_value,
    CALLED_NO_GRP,
    rd_thr.param_value
    SELECT /*+ USE_HASH(T1 T2) */ DECODE (CURR.START_DATE, '', PREV.START_DATE, CURR.START_DATE) START_DATE,
    DECODE (CURR.START_HOUR, '', PREV.START_HOUR, CURR.START_HOUR) START_HOUR,
    DECODE (CURR.IN_PARTNER, '', PREV.IN_PARTNER, CURR.IN_PARTNER) IN_PARTNER,
    DECODE (CURR.OUT_PARTNER, '', PREV.OUT_PARTNER, CURR.OUT_PARTNER) OUT_PARTNER,
    DECODE (CURR.SUBSCRIBER_TYPE, '', PREV.SUBSCRIBER_TYPE, CURR.SUBSCRIBER_TYPE) SUBSCRIBER_TYPE,
    DECODE (CURR.TRAFFIC_TYPE, '', PREV.TRAFFIC_TYPE, CURR.TRAFFIC_TYPE) TRAFFIC_TYPE,
    DECODE (CURR.EVENT_TYPE, '', PREV.EVENT_TYPE, CURR.EVENT_TYPE) EVENT_TYPE,
    DECODE (CURR.INTERVAL_PERIOD, '', PREV.INTERVAL_PERIOD, CURR.INTERVAL_PERIOD) INTERVAL_PERIOD,
    --DECODE (CURR.THRESHOLD, '', PREV.THRESHOLD, CURR.THRESHOLD) THRESHOLD,
    DECODE (CURR.CALLED_NO_GRP, '', PREV.CALLED_NO_GRP, CURR.CALLED_NO_GRP) CALLED_NO_GRP,
    SUM (DECODE (CURR.EVENT_COUNT, '', 0, CURR.EVENT_COUNT)) EVENT_COUNT,
    --SUM (DECODE (CURR.EVENT_DURATION, '', 0, CURR.EVENT_DURATION)) EVENT_DURATION,
    --SUM (DECODE (CURR.DATA_VOLUME, '', 0, CURR.DATA_VOLUME)) DATA_VOLUME,
    --AVG (DECODE (CURR.AVERAGE_DURATION, '', 0, CURR.AVERAGE_DURATION)) AVERAGE_DURATION,
    SUM (DECODE (PREV.EVENT_COUNT_PREV, '', 0, PREV.EVENT_COUNT_PREV)) EVENT_COUNT_PREV,
    --SUM ( DECODE (PREV.EVENT_DURATION_PREV, '', 0, PREV.EVENT_DURATION_PREV)) EVENT_DURATION_PREV,
    --SUM (DECODE (PREV.DATA_VOLUME_PREV, '', 0, PREV.DATA_VOLUME_PREV)) DATA_VOLUME_PREV,
    --AVG ( DECODE (PREV.AVERAGE_DURATION_PREV, '', 0, PREV.AVERAGE_DURATION_PREV)) AVERAGE_DURATION_PREV,
    ABS ( SUM (DECODE (CURR.EVENT_COUNT, '', 0, CURR.EVENT_COUNT)) - SUM ( DECODE (PREV.EVENT_COUNT_PREV, '', 0, PREV.EVENT_COUNT_PREV))) EVENT_COUNT_DIFF
    FROM CURR
    FULL OUTER JOIN
    PREV
    ON ( CURR.START_DATE = PREV.START_DATE
    AND CURR.START_HOUR = PREV.START_HOUR
    AND CURR.IN_PARTNER = PREV.IN_PARTNER
    AND CURR.OUT_PARTNER = PREV.OUT_PARTNER
    AND CURR.SUBSCRIBER_TYPE = PREV.SUBSCRIBER_TYPE
    AND CURR.TRAFFIC_TYPE = PREV.TRAFFIC_TYPE
    AND CURR.INTERVAL_PERIOD = PREV.INTERVAL_PERIOD
    --AND CURR.THRESHOLD           = PREV.THRESHOLD
    AND CURR.EVENT_TYPE = PREV.EVENT_TYPE
    AND CURR.CALLED_NO_GRP = PREV.CALLED_NO_GRP)
    GROUP BY DECODE (CURR.START_DATE, '', PREV.START_DATE, CURR.START_DATE),
    DECODE (CURR.START_HOUR, '', PREV.START_HOUR, CURR.START_HOUR),
    DECODE (CURR.IN_PARTNER, '', PREV.IN_PARTNER, CURR.IN_PARTNER),
    DECODE (CURR.OUT_PARTNER, '', PREV.OUT_PARTNER, CURR.OUT_PARTNER),
    DECODE (CURR.SUBSCRIBER_TYPE, '', PREV.SUBSCRIBER_TYPE, CURR.SUBSCRIBER_TYPE),
    DECODE (CURR.TRAFFIC_TYPE, '', PREV.TRAFFIC_TYPE, CURR.TRAFFIC_TYPE),
    DECODE (CURR.INTERVAL_PERIOD, '', PREV.INTERVAL_PERIOD, CURR.INTERVAL_PERIOD),
    --DECODE (CURR.THRESHOLD, '', PREV.THRESHOLD, CURR.THRESHOLD),
    DECODE (CURR.EVENT_TYPE, '', PREV.EVENT_TYPE, CURR.EVENT_TYPE),
    DECODE (CURR.CALLED_NO_GRP, '', PREV.CALLED_NO_GRP, CURR.CALLED_NO_GRP);

  • Need to tune this query

    Hi
    I dont know anything about tuning
    can anybody help to tune this query
    SQL> set autotrace traceonly explain
    SQL> select count(*) from ibs_x_t_receipts c
      2  where exists                          
      3  (Select 1 from ibs_s_i_doc_receipt a,ibs_x_t_bill b
      4   where A.app_fr_doc_no = c.receipt_no
      5     and a.app_to_doc_no = b.doc_no
      6     and a.app_to_tr_type = 'TRN001'
      7     and A.app_fr_tr_type = 'TRN002'
      8     and b.bill_month <= '31-dec-2008'
      9     and b.balance_ser_amt = 0
    10     and b.balance_tax_amt = 0)
    11  /
    Execution Plan
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=212880 Card=1 Byte
              s=21)
       1    0   SORT (AGGREGATE)
       2    1     NESTED LOOPS (Cost=212880 Card=1 Bytes=21)
       3    2       VIEW OF 'VW_SQ_1' (VIEW) (Cost=212878 Card=1 Bytes=14)
       4    3         HASH (UNIQUE)
       5    4           NESTED LOOPS
       6    5             NESTED LOOPS (Cost=212878 Card=1 Bytes=66)
       7    6               VIEW OF 'index$_join$_002' (VIEW) (Cost=30021
              Card=91387 Bytes=3564093)
       8    7                 HASH JOIN
       9    8                   INDEX (RANGE SCAN) OF 'SIDOC_INDX1' (INDEX
              ) (Cost=171215 Card=91387 Bytes=3564093)
      10    8                   INDEX (RANGE SCAN) OF 'SIDOC_INDX2' (INDEX
              ) (Cost=366130 Card=91387 Bytes=3564093)
      11    6               INDEX (UNIQUE SCAN) OF 'ITL_PK2' (INDEX (UNIQU
              E)) (Cost=1 Card=1)
      12    5             TABLE ACCESS (BY INDEX ROWID) OF 'IBS_X_T_BILL'
              (TABLE) (Cost=2 Card=1 Bytes=27)
      13    2       INDEX (UNIQUE SCAN) OF 'RECEIPTS_PK2' (INDEX (UNIQUE))
               (Cost=1 Card=1 Bytes=7)it is running like anything, i didn't get the result.
    Please help me
    kanish

    --untested
    SELECT COUNT (*)
      FROM ibs_x_t_receipts c
    WHERE EXISTS (
              SELECT 1
                FROM ibs_s_i_doc_receipt a
               WHERE a.app_fr_doc_no = c.receipt_no
                 AND a.app_to_tr_type = 'TRN001'
                 AND a.app_fr_tr_type = 'TRN002'
                 AND EXISTS (
                        SELECT 1
                          FROM ibs_x_t_bill b
                         WHERE a.app_to_doc_no = b.doc_no
                           AND b.bill_month <= '31-dec-2008'
                           AND b.balance_ser_amt = 0
                           AND b.balance_tax_amt = 0))regards,
    friend
    Edited by: most wanted!!!! on Apr 17, 2012 3:51 AM

  • Need help in tunnig the query

    Experts,
    Plz help in tuning this query
    SELECT
    DECODE(WSH_DELIVERY_DETAILS.LOT_NUMBER,'5I27164/1U',1, TO_NUMBER(SUBSTR(WSH_DELIVERY_DETAILS.LOT_NUMBER, (LENGTH(WSH_DELIVERY_DETAILS.LOT_NUMBER) - INSTR(REVERSE(WSH_DELIVERY_DETAILS.LOT_NUMBER),'/') + 2), (INSTR(REVERSE(WSH_DELIVERY_DETAILS.LOT_NUMBER),'/')-1))) ) AS NO_OF_PLATES,
         P_FORM.DESCRIPTION FORMOFPRODUCT,
    HZ_PARTIES.PARTY_NAME CUSTOMER, HZ_CUST_ACCOUNTS.ACCOUNT_NUMBER ACCT_NUM,
         NVL(OE_ORDER_HEADERS_ALL.CUST_PO_NUMBER,'XXXX') CUST_PO,
         INITCAP(HZ_PARTIES.ADDRESS1) BILL_ADD1,
    INITCAP(HZ_PARTIES.ADDRESS2) BILL_ADD2,
    INITCAP(HZ_PARTIES.ADDRESS3) BILL_ADD3,
    INITCAP(HZ_PARTIES.ADDRESS4) BILL_ADD4,
         INITCAP(HZ_PARTIES.CITY) BILL_CITY,
    INITCAP(HZ_PARTIES.STATE) BILL_STATE,
    HZ_PARTIES.POSTAL_CODE BILL_PC,
         INITCAP(HZ_LOCATIONS.ADDRESS1) SHIP_ADD1,
    INITCAP(HZ_LOCATIONS.ADDRESS2) SHIP_ADD2,
    INITCAP(HZ_LOCATIONS.ADDRESS3) SHIP_ADD3,
    INITCAP(HZ_LOCATIONS.ADDRESS4) SHIP_ADD4,
         INITCAP(HZ_LOCATIONS.CITY) SHIP_CITY,
    INITCAP(HZ_LOCATIONS.STATE) SHIP_STATE,
    HZ_LOCATIONS.POSTAL_CODE SHIP_PC,
         OE_TRANSACTION_TYPES_TL.NAME CATEGORY ,
         OE_ORDER_HEADERS_ALL.ORDER_NUMBER,
    OE_ORDER_HEADERS_ALL.SOURCE_DOCUMENT_ID,
    OE_ORDER_HEADERS_ALL.HEADER_ID,
    OE_ORDER_HEADERS_ALL.FREIGHT_TERMS_CODE,
    /* to_char(oe_order_headers_all.ORDERED_DATE,'DD-MON-RR HH24:MI:SS') ORDER_DATE,*/
    to_char(sysdate,'DD/MM/RRRR HH24:MI:SS') ORDERED_DATE,
         ROWNUM,
    OE_ORDER_LINES_ALL.INVENTORY_ITEM_ID,
         OE_ORDER_LINES_ALL.ORDERED_ITEM,
         OE_ORDER_LINES_ALL.ORDERED_QUANTITY,
         WSH_DELIVERY_DETAILS.SHIPPED_QUANTITY+DECODE(WSH_DELIVERY_DETAILS.DELIVERY_DETAIL_ID,129881,.22,0) AS SHIPPED_QUANTITY1, (WSH_DELIVERY_DETAILS.SHIPPED_QUANTITY+DECODE(WSH_DELIVERY_DETAILS.DELIVERY_DETAIL_ID,129881,.22,0))*OE_ORDER_LINES_ALL.UNIT_SELLING_PRICE AS LINE_PRICE,
         OE_ORDER_LINES_ALL.UNIT_SELLING_PRICE,
         JA_IN_RG_I.FOR_HOME_USE_PAY_ED_VAL,
    ----      SUBSTR(JA_IN_RG_I.EXCISE_INVOICE_NUMBER,1,2)|| SUBSTR(JA_IN_RG_I.EXCISE_INVOICE_NUMBER,4,8) INVOICE_NO,
         JA_IN_RG_I.EXCISE_INVOICE_NUMBER INVOICE_NO,
    to_char(JA_IN_RG_I.CREATION_DATE,'DD/MM/RRRR') INVOICE_DATE1,
         to_char(JA_IN_RG_I.EXCISE_INVOICE_DATE,'DD-MON-RR HH24:MI:SS') INV_DATE,
         to_char(JA_IN_RG_I.CREATION_DATE,'DD/MM/RRRR HH24:MI:SS') INVOICE_DATE,
         JA_IN_RG_I.EXCISE_DUTY_RATE,
         JA_IN_RG_I.EXCISE_DUTY_AMOUNT,
         WSH_DELIVERY_DETAILS.LOT_NUMBER,
    WSH_TRIPS.CARRIER_ID CARRIER_ID,
    WSH_TRIPS.VEHICLE_NUM_PREFIX,
    WSH_TRIPS.SEAL_CODE,
    WSH_TRIPS.ROUTING_INSTRUCTIONS,
    WSH_TRIPS.OPERATOR, WSH_NEW_DELIVERIES. DELIVERY_ID,
    WSH_NEW_DELIVERIES. ADDITIONAL_SHIPMENT_INFO TRUCK_NO,
         WSH_TRIPS.MODE_OF_TRANSPORT VEHICLE_TYPE,
    WSH_TRIPS.ATTRIBUTE6||' '|| WSH_TRIPS.ATTRIBUTE7||' '|| WSH_TRIPS.ATTRIBUTE8 REMARKS,
         WSH_TRIPS.ATTRIBUTE1 LR_NO, WSH_TRIPS.ATTRIBUTE7,
         WSH_TRIPS.ATTRIBUTE2 LR_DATE,
         DECODE(WSH_TRIPS.ATTRIBUTE3, '', '', 'ARE NO '||WSH_TRIPS.ATTRIBUTE3) AS ARE_NO,
         DECODE(WSH_TRIPS.ATTRIBUTE6, '', '', WSH_TRIPS.ATTRIBUTE6) AS REMARK1,
         DECODE(WSH_TRIPS.ATTRIBUTE4, '', '', 'R.P. NO. ' ||WSH_TRIPS.ATTRIBUTE4) AS PERMIT,
         DECODE(WSH_TRIPS.ATTRIBUTE5, '', '', 'Export Under '||WSH_TRIPS.ATTRIBUTE5) AS EXPORT_UNDER,
         DECODE(WSH_NEW_DELIVERIES.PORT_OF_DISCHARGE,'','', 'Seal No : '||WSH_NEW_DELIVERIES.PORT_OF_DISCHARGE) AS SEAL_NO,
         DECODE(WSH_NEW_DELIVERIES.DESCRIPTION, '', '', 'Container No : ' ||WSH_NEW_DELIVERIES.DESCRIPTION) AS CONTAINER_NO,
         MTL_SYSTEM_ITEMS_B.ATTRIBUTE4 AS EXCISE_TARIFF_NO,
         --MTL_SYSTEM_ITEMS_B.DESCRIPTION,
         HZ_CUST_ACCOUNTS.ACCOUNT_NUMBER,
         JSW_LOT_PACKSLIP.PACKSLIP_NO PACKSLIP,
         PR_TYPE.DESCRIPTION ||' ,'||
         P_FORM.DESCRIPTION || ' ,'||
         PR_GRADE.DESCRIPTION ||' ,'||
         PR_QTY.DESCRIPTION || ' ,'||
         DECODE(SUBSTR(PR_STL.DESCRIPTION,1,3),'Not','', PR_STL.DESCRIPTION) DESCRIPTION ,
    HZ_CUST_ACCT_SITES_ALL.ATTRIBUTE7 S_CST_NO,
    HZ_CUST_ACCT_SITES_ALL.ATTRIBUTE6 S_LST_NO,
    HZ_CUST_ACCT_SITES_ALL.ATTRIBUTE5 S_ECC_NO,
    A.ATTRIBUTE7 B_CST_NO,
    A.ATTRIBUTE6 B_LST_NO,
    INTERFACECRM.JSW_MES_COMMON_TNGL_T.JSW_ADDMINUTES(WSH_TRIPS.VEHICLE_NUM_PREFIX) POSTFIX_NUM
    FROM -- jsw_vat_slno,
         MTL_PARAMETERS,
         HZ_PARTIES,
         HZ_CUST_ACCOUNTS,
         HZ_LOCATIONS,
         HZ_PARTY_SITES,
         HZ_CUST_ACCT_SITES_ALL,
         HZ_CUST_SITE_USES_ALL,
    HZ_CUST_ACCT_SITES_ALL A,
    HZ_CUST_SITE_USES_ALL B,
         OE_TRANSACTION_TYPES_TL,
         JA_IN_RG_I,
         WSH_DELIVERY_DETAILS,
         OE_ORDER_LINES_ALL,
         OE_ORDER_HEADERS_ALL,
         WSH_DELIVERY_ASSIGNMENTS,
         WSH_NEW_DELIVERIES,
         WSH_DELIVERY_LEGS,
         WSH_TRIP_STOPS,
         WSH_TRIPS,
         MTL_SYSTEM_ITEMS_B,
         JSW_LOT_PACKSLIP,
         IC_TRAN_PND,
                   JSW_ITM_SEARCH_PRD_TYP          PR_TYPE,
              JSW_ITM_SEARCH_PRD_FRM          P_FORM     ,
                   JSW_ITM_SEARCH_PRD_GRD          PR_GRADE,      
              JSW_ITM_SEARCH_QUALITY_LEVEL PR_QTY,      
                   JSW_ITEM_SEARCH_SLITTING      PR_STL
    WHERE /* jsw_vat_slno.excise_invoice_number=ja_in_rg_i.excise_invoice_number and jsw_vat_slno.organization_id = ja_in_rg_i.organization_id */
    HZ_PARTIES.PARTY_ID = HZ_CUST_ACCOUNTS.PARTY_ID
         AND HZ_CUST_ACCOUNTS.CUST_ACCOUNT_ID = OE_ORDER_HEADERS_ALL.SOLD_TO_ORG_ID
         AND OE_ORDER_HEADERS_ALL.SHIP_TO_ORG_ID = HZ_CUST_SITE_USES_ALL.SITE_USE_ID
         AND HZ_CUST_SITE_USES_ALL.CUST_ACCT_SITE_ID = HZ_CUST_ACCT_SITES_ALL.CUST_ACCT_SITE_ID
    AND OE_ORDER_HEADERS_ALL.INVOICE_TO_ORG_ID = B.SITE_USE_ID
         AND B.CUST_ACCT_SITE_ID                          = A.CUST_ACCT_SITE_ID
         AND HZ_CUST_ACCT_SITES_ALL.PARTY_SITE_ID      = HZ_PARTY_SITES.PARTY_SITE_ID
         AND HZ_PARTY_SITES.LOCATION_ID = HZ_LOCATIONS.LOCATION_ID
         AND OE_ORDER_LINES_ALL.SHIP_FROM_ORG_ID = MTL_PARAMETERS.ORGANIZATION_ID
         AND OE_ORDER_HEADERS_ALL.ORDER_TYPE_ID = OE_TRANSACTION_TYPES_TL.TRANSACTION_TYPE_ID
    and upper(oe_transaction_types_tl.description) not like '%SUP%'
         AND OE_ORDER_HEADERS_ALL.HEADER_ID = WSH_DELIVERY_DETAILS.SOURCE_HEADER_ID
         AND OE_ORDER_HEADERS_ALL.HEADER_ID = OE_ORDER_LINES_ALL.HEADER_ID
         AND OE_ORDER_LINES_ALL.LINE_ID = WSH_DELIVERY_DETAILS.SOURCE_LINE_ID
         AND TO_CHAR(WSH_DELIVERY_DETAILS.DELIVERY_DETAIL_ID ) = JA_IN_RG_I.REF_DOC_ID
         AND WSH_DELIVERY_DETAILS.DELIVERY_DETAIL_ID = WSH_DELIVERY_ASSIGNMENTS.DELIVERY_DETAIL_ID
         AND WSH_DELIVERY_ASSIGNMENTS.DELIVERY_ID = WSH_NEW_DELIVERIES.DELIVERY_ID
         AND WSH_NEW_DELIVERIES.DELIVERY_ID = WSH_DELIVERY_LEGS.DELIVERY_ID
         AND WSH_DELIVERY_LEGS.PICK_UP_STOP_ID = WSH_TRIP_STOPS.STOP_ID
         AND WSH_TRIP_STOPS.TRIP_ID                = WSH_TRIPS.TRIP_ID
    /* Input parameter can be either Invoice number or Delivery Id */
         AND (WSH_NEW_DELIVERIES.DELIVERY_ID = :DEL_ID OR JA_IN_RG_I.EXCISE_INVOICE_NUMBER = :INVOICE_NUMBER)
         AND NVL(WSH_DELIVERY_DETAILS.SHIPPED_QUANTITY,0) <>0
         AND     MTL_SYSTEM_ITEMS_B.ORGANIZATION_ID     = WSH_DELIVERY_DETAILS.ORGANIZATION_ID
         AND     MTL_SYSTEM_ITEMS_B.INVENTORY_ITEM_ID = WSH_DELIVERY_DETAILS.INVENTORY_ITEM_ID
         AND IC_TRAN_PND.LINE_DETAIL_ID               = WSH_DELIVERY_DETAILS.DELIVERY_DETAIL_ID
         AND     JSW_LOT_PACKSLIP.LOT_ID                    = IC_TRAN_PND.LOT_ID(+)
         AND     JSW_LOT_PACKSLIP.DELIVERY_ID          = WSH_NEW_DELIVERIES.DELIVERY_ID(+)
         AND      IC_TRAN_PND.LINE_ID                    = OE_ORDER_LINES_ALL.LINE_ID                                                  
         AND     IC_TRAN_PND.DELETE_MARK                = 0
         AND IC_TRAN_PND.COMPLETED_IND      = 1
         AND      IC_TRAN_PND.STAGED_IND                    =     1
         AND     P_FORM.CODE(+)                                   = substr(OE_ORDER_LINES_ALL.ORDERED_ITEM,3,2)
         AND     PR_TYPE.CODE                                   = substr(OE_ORDER_LINES_ALL.ORDERED_ITEM,1,2)
         AND     PR_TYPE.CODE                                   = P_FORM.PRD_TYPE_CODE
         AND     P_FORM.CODE                                   = substr(OE_ORDER_LINES_ALL.ORDERED_ITEM,3,2)
    AND     P_FORM.CODE                                   = PR_GRADE.PRD_FRM_CODE
         AND     PR_GRADE.CODE                                   = substr(OE_ORDER_LINES_ALL.ORDERED_ITEM,5,2)     
         AND     PR_GRADE.CODE                                   = PR_QTY.PRD_GRD_CODE
         AND     PR_QTY.CODE                                   = substr(OE_ORDER_LINES_ALL.ORDERED_ITEM,7,2)
         AND     PR_STL.PROD_CODE                              = PR_TYPE.CODE
         AND     PR_STL.QUALITY_LEVEL_CODE                    = PR_QTY.CODE
         AND     PR_STL.CODE                                   = substr(OE_ORDER_LINES_ALL.ORDERED_ITEM,9,2)
         AND rownum=1
    thanks,
    baskar.l

    Here is the explain plan
    PLAN_TABLE_OUTPUT
    | Id | Operation | Name | Rows | Bytes | Cost |
    | 0 | SELECT STATEMENT | | 1 | 920 | 12628 |
    | 1 | COUNT STOPKEY | | | | |
    | 2 | NESTED LOOPS | | 1 | 920 | 12628 |
    | 3 | NESTED LOOPS | | 1 | 728 | 12627 |
    | 4 | NESTED LOOPS | | 1 | 718 | 12626 |
    | 5 | NESTED LOOPS | | 1 | 684 | 12625 |
    | 6 | NESTED LOOPS | | 1 | 674 | 12624 |
    | 7 | NESTED LOOPS | | 1 | 665 | 12623 |
    | 8 | NESTED LOOPS | | 1 | 655 | 12622 |
    | 9 | NESTED LOOPS | | 1 | 532 | 12621 |
    | 10 | NESTED LOOPS | | 1 | 522 | 12620 |
    | 11 | FILTER | | | | |
    | 12 | NESTED LOOPS OUTER | | | | |
    | 13 | NESTED LOOPS | | 1 | 494 | 12617 |
    | 14 | NESTED LOOPS | | 1 | 477 | 12614 |
    | 15 | NESTED LOOPS | | 1 | 467 | 12611 |
    | 16 | NESTED LOOPS | | 1 | 382 | 12610 |
    | 17 | NESTED LOOPS | | 1 | 366 | 12609 |
    | 18 | NESTED LOOPS | | 1 | 321 | 12606 |
    | 19 | FILTER | | | | |
    | 20 | HASH JOIN OUTER | | | | |
    | 21 | TABLE ACCESS BY INDEX ROWID| IC_TRAN_PND | 1 | 22 | 3 |
    | 22 | NESTED LOOPS | | 1 | 292 | 12601 |
    | 23 | HASH JOIN | | 1 | 270 | 12598 |
    | 24 | NESTED LOOPS | | 4011 | 908K| 6272 |
    | 25 | HASH JOIN | | 4012 | 893K| 6272 |
    | 26 | TABLE ACCESS FULL | JSW_ITM_SEARCH_PRD_GRD | 33 | 759 | 2 |
    | 27 | HASH JOIN | | 20547 | 4113K| 6269 |
    | 28 | TABLE ACCESS FULL | JSW_ITM_SEARCH_QUALITY_LEVEL | 54 | 1296 | 2 |
    | 29 | HASH JOIN | | 24352 | 4304K| 6266 |
    | 30 | TABLE ACCESS FULL | JSW_ITM_SEARCH_PRD_TYP | 7 | 154 | 2 |
    | 31 | HASH JOIN | | 170K| 25M| 6260 |
    | 32 | TABLE ACCESS FULL | JSW_ITEM_SEARCH_SLITTING | 73 | 1971 | 2 |
    | 33 | HASH JOIN | | 44367 | 5719K| 6257 |
    | 34 | HASH JOIN | | 4469 | 410K| 367 |
    | 35 | TABLE ACCESS FULL| OE_TRANSACTION_TYPES_TL | 18 | 846 | 4 |
    | 36 | TABLE ACCESS FULL| OE_ORDER_HEADERS_ALL | 38240 | 1755K| 362 |
    | 37 | TABLE ACCESS FULL | OE_ORDER_LINES_ALL | 379K| 13M| 5761 |
    | 38 | INDEX UNIQUE SCAN | MTL_PARAMETERS_U1 | 1 | 4 | |
    | 39 | TABLE ACCESS FULL | WSH_DELIVERY_DETAILS | 579K| 21M| 5926 |
    | 40 | INDEX RANGE SCAN | IC_TRAN_PND_N1 | 2 | | 2 |
    | 41 | TABLE ACCESS FULL | JSW_ITM_SEARCH_PRD_FRM | 16 | 272 | 2 |
    | 42 | TABLE ACCESS BY INDEX ROWID | MTL_SYSTEM_ITEMS_B | 1 | 12 | 2 |
    | 43 | INDEX UNIQUE SCAN | MTL_SYSTEM_ITEMS_B_U1 | 1 | | 1 |
    | 44 | TABLE ACCESS BY INDEX ROWID | JA_IN_RG_I | 1 | 45 | 3 |
    | 45 | INDEX RANGE SCAN | JA_IN_RG_I_N3 | 1 | | 2 |
    | 46 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_ACCOUNTS | 1 | 16 | 1 |
    | 47 | INDEX UNIQUE SCAN | HZ_CUST_ACCOUNTS_U1 | 1 | | |
    | 48 | TABLE ACCESS BY INDEX ROWID | HZ_PARTIES | 1 | 85 | 1 |
    | 49 | INDEX UNIQUE SCAN | HZ_PARTIES_U1 | 1 | | |
    | 50 | TABLE ACCESS BY INDEX ROWID | WSH_DELIVERY_ASSIGNMENTS | 1 | 10 | 3 |
    | 51 | INDEX RANGE SCAN | WSH_DELIVERY_ASSIGNMENTS_N3 | 1 | | 2 |
    | 52 | TABLE ACCESS BY INDEX ROWID | JSW_LOT_PACKSLIP | 1 | 17 | 3 |
    | 53 | INDEX RANGE SCAN | JSW_LOT_PACKSLIP_N1 | 1 | | 2 |
    | 54 | TABLE ACCESS BY INDEX ROWID | WSH_NEW_DELIVERIES | 1 | 18 | 1 |
    | 55 | INDEX UNIQUE SCAN | WSH_NEW_DELIVERIES_U1 | 1 | | |
    | 56 | TABLE ACCESS BY INDEX ROWID | WSH_DELIVERY_LEGS | 1 | 10 | 2 |
    | 57 | INDEX RANGE SCAN | WSH_DELIVERY_LEGS_N1 | 1 | | 1 |
    | 58 | TABLE ACCESS BY INDEX ROWID | WSH_TRIP_STOPS | 1 | 10 | 1 |
    | 59 | INDEX UNIQUE SCAN | WSH_TRIP_STOPS_U1 | 1 | | |
    | 60 | TABLE ACCESS BY INDEX ROWID | WSH_TRIPS | 1 | 123 | 1 |
    | 61 | INDEX UNIQUE SCAN | WSH_TRIPS_U1 | 1 | | |
    | 62 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_SITE_USES_ALL | 1 | 10 | 1 |
    | 63 | INDEX UNIQUE SCAN | HZ_CUST_SITE_USES_U1 | 1 | | |
    | 64 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_ACCT_SITES_ALL | 1 | 9 | 1 |
    | 65 | INDEX UNIQUE SCAN | HZ_CUST_ACCT_SITES_U1 | 1 | | |
    | 66 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_SITE_USES_ALL | 1 | 10 | 1 |
    | 67 | INDEX UNIQUE SCAN | HZ_CUST_SITE_USES_U1 | 1 | | |
    | 68 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_ACCT_SITES_ALL | 1 | 34 | 1 |
    | 69 | INDEX UNIQUE SCAN | HZ_CUST_ACCT_SITES_U1 | 1 | | |
    | 70 | TABLE ACCESS BY INDEX ROWID | HZ_PARTY_SITES | 1 | 10 | 1 |
    | 71 | INDEX UNIQUE SCAN | HZ_PARTY_SITES_U1 | 1 | | |
    | 72 | TABLE ACCESS BY INDEX ROWID | HZ_LOCATIONS | 1 | 192 | 1 |
    | 73 | INDEX UNIQUE SCAN | HZ_LOCATIONS_U1 | 1 | | |
    we need to tune this query to reduce it time of execution as our users are very much affected in running requests.
    thanks,
    baskar.l

Maybe you are looking for