Rewrite this query

Hi all,
Can we rewrite this query as simplest.Becasue when i Execute this query it will take more time appro 3hrs.So can we rewrite this as possible.
SELECT  scon.uabscon_number,
                    scon.uabscon_cust_code,
                    scon.uabscon_prem_code,
                    scon.uabscon_mf_status,
                    letd.usrletd_mf_next_visit_date,
                    evau.ucrevau_invn_code,
                    evau.ucrevau_prod_number
             FROM   uimsmgr.usrletd letd,
                    uimsmgr.ucrevau evau,
                    uimsmgr.uabscon scon
             WHERE  scon.uabscon_mf_status = :cMoveForwardPhase
             AND    scon.uabscon_status_ind IN ('A','R')
             AND    evau.ucrevau_scon_number = scon.uabscon_number
             AND    evau.ucrevau_event_type  = :currentLetterTypeLevel /* FLT1,ALT1,FLT2, ... */
             AND    evau.ucrevau_value_1     = :letterTypeCode /* FV1,ASV1, ... */
             AND    evau.ucrevau_activity_date = (SELECT max(ee.ucrevau_activity_date)
                                                  FROM   uimsmgr.ucrevau ee
                                                  WHERE  ee.ucrevau_scon_number = scon.uabscon_number
                                                  AND    (ee.ucrevau_event_type like 'FLT%'
                                                          OR ee.ucrevau_event_type like 'ALT%'))
             AND   letd.usrletd_actual_cust_code  = scon.uabscon_cust_code
             AND   letd.usrletd_prem_code         = scon.uabscon_prem_code
             AND   letd.usrletd_letr_code         = :letterTypeCode /* FV1,ASV1, ... */
             AND   letd.usrletd_printed_date      <= SYSDATE - :mfFirstDelayDays
             AND   letd.usrletd_printed_ind       = 'Y'
             AND   TRUNC(letd.usrletd_activity_date) >= TRUNC(evau.ucrevau_activity_date)
             AND EXISTS (   SELECT 1
                            FROM   uimsmgr.utvsrvc srvc,
                                   uimsmgr.ucrserv serv
                            WHERE  serv.ucrserv_scon_number = scon.uabscon_number
                            AND    serv.ucrserv_cust_code   = scon.uabscon_cust_code
                            AND    serv.ucrserv_prem_code   = scon.uabscon_prem_code
                            AND    TRUNC(serv.ucrserv_next_visit_date) <= TRUNC(SYSDATE) + :mfDueRange
                            AND    serv.ucrserv_srvc_code   = srvc.utvsrvc_code
                            AND    srvc.utvsrvc_bus_sector_id = 1 /* only business sector 1*/
                            AND    DECODE( NVL(serv.ucrserv_next_visit_type, 'A'),
                                               'NOFV', 'A',
                                               'FV'  , 'F',
                                               'FAS' , 'A',
                                               'A'   , 'A',
                                                       'Z' ) = :visitType
                            );

SELECT /*+ ordered */  scon.uabscon_number,
                    scon.uabscon_cust_code,
                    scon.uabscon_prem_code,
                    scon.uabscon_mf_status,
                    letd.usrletd_mf_next_visit_date,
                    evau.ucrevau_invn_code,
                    evau.ucrevau_prod_number
             FROM   uimsmgr.usrletd letd,
                    uimsmgr.ucrevau evau,
                    uimsmgr.uabscon scon
             WHERE   letd.usrletd_printed_date      <= SYSDATE - :mfFirstDelayDays and scon.uabscon_mf_status = :cMoveForwardPhase
             AND    scon.uabscon_status_ind IN ('A','R')
             AND    evau.ucrevau_scon_number = scon.uabscon_number
             AND    evau.ucrevau_event_type  = :currentLetterTypeLevel /* FLT1,ALT1,FLT2, ... */
             AND    evau.ucrevau_value_1     = :letterTypeCode /* FV1,ASV1, ... */
             AND    evau.ucrevau_activity_date = (SELECT max(ee.ucrevau_activity_date)
                                                  FROM   uimsmgr.ucrevau ee
                                                  WHERE  ee.ucrevau_scon_number = scon.uabscon_number
                                                  AND    (ee.ucrevau_event_type like 'FLT%'
                                                          OR ee.ucrevau_event_type like 'ALT%'))
             AND   letd.usrletd_actual_cust_code  = scon.uabscon_cust_code
             AND   letd.usrletd_prem_code         = scon.uabscon_prem_code
             AND   letd.usrletd_letr_code         = :letterTypeCode /* FV1,ASV1, ... */
             AND   letd.usrletd_printed_ind       = 'Y'
             AND   TRUNC(letd.usrletd_activity_date) >= TRUNC(evau.ucrevau_activity_date)
             AND EXISTS (   SELECT 1
                            FROM   uimsmgr.utvsrvc srvc,
                                   uimsmgr.ucrserv serv
                            WHERE  serv.ucrserv_scon_number = scon.uabscon_number
                            AND    serv.ucrserv_cust_code   = scon.uabscon_cust_code
                            AND    serv.ucrserv_prem_code   = scon.uabscon_prem_code
                            AND    TRUNC(serv.ucrserv_next_visit_date) <= TRUNC(SYSDATE) + :mfDueRange
                            AND    serv.ucrserv_srvc_code   = srvc.utvsrvc_code
                            AND    srvc.utvsrvc_bus_sector_id = 1 /* only business sector 1*/
                            AND    DECODE( NVL(serv.ucrserv_next_visit_type, 'A'),
                                               'NOFV', 'A',
                                               'FV'  , 'F',
                                               'FAS' , 'A',
                                               'A'   , 'A',
                                                       'Z' ) = :visitType
                            )I suggest this admitting on letd.usrletd_printed_date.
And it would be good if you would also have a lower limit for letd.usrletd_printed_date, so that you would have letd.usrletd_printed_date between ...

Similar Messages

  • How to rewrite this query

    How can i rewrite this query so it uses less inner joins (it causes my temp space to explode :) )
    ( SELECT Waardes.*, Tellers.Nr_Dataitems, Tellers.Nr_Details FROM
    ( SELECT extractvalue(Value(el_node), 'Node/Id') node,
    extractvalue(Value(el_dataitem), 'Detail/Title') Node_Title,
    extractvalue(Value(el_dataitem), 'Detail/Value') Node_Value
    FROM PHILIPS_XML x,
    TABLE (xmlsequence (extract (value(x), '/Tree/Node'))) el_node,
    TABLE (xmlsequence (extract (value(el_node),
    'Node/DataItems/DataItem/DetailSet/Detail'))) el_dataitem
    ) Waardes
    INNER JOIN
    SELECT A.Node, A.Nr_Dataitems, B.Nr_details FROM
    SELECT extractvalue(Value(el_node), 'Node/Id') node,
    count(extract(Value(aaa), 'DataItem')) Nr_Dataitems
    FROM PHILIPS_XML x,
    TABLE (xmlsequence (extract (value(x), '/Tree/Node'))) el_node,
    TABLE (xmlsequence (extract (value(el_node),
    'Node/DataItems/DataItem'))) aaa
    GROUP BY extractvalue(Value(el_node), 'Node/Id')
    ) A
    INNER JOIN
    SELECT extractvalue(Value(el_node), 'Node/Id') node,
    count(extract(Value(bbb), 'Detail')) Nr_details
    FROM PHILIPS_XML x,
    TABLE (xmlsequence (extract (value(x), '/Tree/Node'))) el_node,
    TABLE (xmlsequence (extract (value(el_node),
    'Node/DataItems/DataItem'))) aaa,
    TABLE (xmlsequence (extract (value(aaa),
    'DataItem/DetailSet/Detail' ))) bbb
    GROUP BY extractvalue(Value(el_node), 'Node/Id')
    ) B
    on A.node = B.NODE
    ) Tellers
    ON Waardes.NODE = Tellers.NODE )

    1st Make sure all paths are absolute (start with '/', not just the node name).
    Which release are you using.. Is the document based on an XMLSchema, if so, what annotations were used when registered the XML Schema ?. What does the explain plan look like...

  • How can we rewrite this query for better performance

    Hi All,
    The below query is taking more time to run. Any ideas how to improve the performance by rewriting the query using NOT EXITS or any other way...
    Help Appreciated.
    /* Formatted on 2012/04/25 18:00 (Formatter Plus v4.8.8) */
    SELECT vendor_id
    FROM po_vendors
    WHERE end_date_active IS NULL
    AND enabled_flag = 'Y'
    and vendor_id NOT IN ( /* Formatted on 2012/04/25 18:25 (Formatter Plus v4.8.8) */
    SELECT vendor_id
    FROM po_headers_all
    WHERE TO_DATE (creation_date) BETWEEN TO_DATE (SYSDATE - 365)
    AND TO_DATE (SYSDATE))
    Thanks

    Try this one :
    This will help you for partial fetching of data
    SELECT /*+ first_rows(50) no_cpu_costing */
    vendor_id
    FROM po_vendors
    WHERE end_date_active IS NULL
    AND enabled_flag = 'Y'
    AND vendor_id NOT IN (
    SELECT vendor_id
    FROM po_headers_all
    WHERE TO_DATE (creation_date) BETWEEN TO_DATE (SYSDATE - 365)
    AND TO_DATE (SYSDATE))
    overall your query is also fine, because, the in this query the subquery always contain less data compare to main query.

  • Is there any way to rewrite this query?

    Is there room for improvement/rewrite for this query so that it performs well?
    select distinct shp_locn
      from shp_mstr
    where zone = to_char(:b3)
       and locn_class = 'r'
       and aisle = 'GX-08'
       and dock =  'KN'
       and locn_id not in (select locn_id from tmp_shp_out_dtl)
    order by shp_locn

    user659394 wrote:
    Alex,
    Stop your st_u_pi_d f_u_c__king sarcasm. There were lots of instances like the below thread
    where you bring your boring sarcasm to meaningful technical discussions.
    If you dont want to answer, just leave it..... you C__u__n__t
    Error for a SELECT COUNT ... in stored proc
    Alex was giving you perfectly valid assistance.
    Your post has now been reported to the moderators as it is completely offensive, unprofessional and unnecessary.

  • How to rewrite this query without sub query please help me

    Hello All Good Evening,
    Could you please help me with this query, how can i write this query without sub query, or how can write this query another ways
    please help me
    select planno, status1, count(*) Counts from
    select a.ValetNO PlanNo  ,
    case 
         when JoinCode in ('00', '01', '02') then 'Actcess'
         when JoinCode in ('20', '21', '22', '23','38', '39') then
         'Secured' else 'Other' end Status1 ---, COUNT (*)
       from  dbo.ppt a(NOLOCK)  left join dbo.acts b on a.P_ID = b.P_ID and a.ValetNO  = b.ValetNO
    --group by a.ValetNO
      a group by planno, status1
    order by 2
    Thank you in Advance
    Milan

    Whats your objective here? Sorry, am not able to understand the reason for this change. 
    Try the below:(Not tested)
    ;With cte
    As
    select a.ValetNO PlanNo ,
    case
    when JoinCode in ('00', '01', '02') then 'Actcess'
    when JoinCode in ('20', '21', '22', '23','38', '39') then
    'Secured' else 'Other' end Status1 ---, COUNT (*)
    from dbo.ppt a(NOLOCK) left join dbo.acts b on a.P_ID = b.P_ID and a.ValetNO = b.ValetNO
    select planno, status1, count(*) Counts from cte
    a group by planno, status1
    order by 2
    Even below:
    select a.ValetNO PlanNo ,
    case
    when JoinCode in ('00', '01', '02') then 'Actcess'
    when JoinCode in ('20', '21', '22', '23','38', '39') then
    'Secured' else 'Other' end Status1 , COUNT (1)
    from dbo.ppt a(NOLOCK) left join dbo.acts b on a.P_ID = b.P_ID and a.ValetNO = b.ValetNO
    Group by a.ValetNO ,
    case
    when JoinCode in ('00', '01', '02') then 'Actcess'
    when JoinCode in ('20', '21', '22', '23','38', '39') then
    'Secured' else 'Other' end

  • Can we rewrite this query??

    what i am i doing wrong here..
    this query has performance issue.. RBE_SMF_ATTRIB_HISTORY table has 2 M records..
    SELECT h.pricing_security_id,h.level1 mac1,
    h.level3 mac3,h.level5 mac5,
    h.mat_date maturity,h.country_of_issue country,h.px_date
    FROM GPS.RBE_SMF_ATTRIB_HISTORY h
    WHERE h.px_type = 'PS1'
    AND (create_timestamp, pricing_security_id)
    IN (SELECT MAX(smf.create_timestamp), smf.pricing_security_id
    FROM GPS.RBE_SMF_ATTRIB_HISTORY smf,
    GPS.WK_HOLDINGS_PORTFOLIO wkhp
    WHERE smf.px_type = 'PS1'
    AND smf.px_date = h.px_date
    AND wkhp.pricing_security_id=smf.pricing_security_id
    GROUP BY smf.pricing_security_id )

      SELECT h.pricing_security_id,h.level1 mac1,
             h.level3 mac3,h.level5 mac5,
             h.mat_date maturity,h.country_of_issue country,h.px_date
        FROM GPS.RBE_SMF_ATTRIB_HISTORY h
       WHERE h.px_type = 'PS1'
         AND (create_timestamp, pricing_security_id, px_date) IN (SELECT MAX(smf.create_timestamp), smf.pricing_security_id, smf.px_date
                                                                    FROM GPS.RBE_SMF_ATTRIB_HISTORY smf,
                                                                         GPS.WK_HOLDINGS_PORTFOLIO wkhp
                                                                   WHERE smf.px_type = 'PS1'
                                                                  -- AND smf.px_date = h.px_date                                   <-- try commenting out this line
                                                                     AND wkhp.pricing_security_id = smf.pricing_security_id
                                                                  GROUP BY smf.pricing_security_id, smf.px_date )
    also do you have indexes on your pricing_security_id columns for table GPS.RBE_SMF_ATTRIB_HISTORY and GPS.WK_HOLDINGS_PORTFOLIO?
    note: untested

  • How to rewrite this query to avoid duplicates , please

    Hello Good Morning All,
    Happy New Year,
    Could you please help to rewrite the below two queries (so that i can avoid duplicates) i need to send email to everyone not the dupllicated ones), please?
    Create table #MyPhoneList
     AccountID int,
     EmailWork varchar(50),
     EmailHome varchar(50),
     EmailOther varchar(50),
     IsOffersToWorkEmail bit,
     IsOffersToHomeEmail bit,
     IsOffersToOtherEmail bit,
     IsValidEmailWork bit,
     IsValidEmailHome bit,
     IsValidEmailOther bit
    --> In this table AccountID is uniquee
    --> email values could be null or repetetive for work / home / Other (same email can be used more than one columns for accountid)
    -- a new column will be created with name as Sourceflag( the value could be work, Home, Other depend on email coming from) then removes duplicates
    SELECT AccountID , Email, SourceFlag, ROW_NUMBER() OVER(PARTITION BY AccountID, Email ORDER BY Sourceflag desc) AS ROW
    INTO #List
    from (
      SELECT AccountID
         , EmailWork      AS EMAIL
         , 'Work'       AS SourceFlag
      FROM #MyPhoneList (NoLock) eml
      WHERE IsOffersToWorkEmail    = 1
      AND  EMAILWORK      IS NOT NULL
      AND  IsValidEmailWork    = 1
     UNION
      SELECT AccountID
         , EmailHome  
         , 'Home'       AS SourceFlag
      FROM #MyPhoneList (NoLock) eml
      WHERE IsOffersToHomeEmail    = 1
      AND  EMAILHOME      IS NOT NULL
      AND  IsValidEmailHome    = 1
     UNION
      SELECT AccountID
         , EmailOther  
         , 'Other'       AS Sourceflag
      FROM #MyPhoneList (NoLock) eml
      WHERE EmailOther      = 1
      AND  EMAILOther      IS NOT NULL
      AND  IsValidEmailOther    = 1
     ) eml --select count(*) from #email
    --Email dedupe on source
    SELECT * INTO #distinct FROM #List WHERE ROW  = 1
    Thank you in Advance
    Milan

    Please follow basic Netiquette and post the DDL we need to answer this. Follow industry and ANSI/ISO standards in your data. You should follow ISO-11179 rules for naming data elements. You should follow ISO-8601 rules for displaying temporal data. We need
    to know the data types, keys and constraints on the table. Avoid dialect in favor of ANSI/ISO Standard SQL. And you need to read and download the PDF for: 
    https://www.simple-talk.com/books/sql-books/119-sql-code-smells/
    >> Could you please help to rewrite the below two queries (so that I can avoid duplicates) I need to send email to everyone not the duplicated ones), please? <<
    This mess is not a table because it has no keys, not way to have a key. You are using UNION like we used punch card merges in the o9ld days. 
    What math do you do on the account_id? That is the only reason that you use numeric values Why do you think that an email is fifty characters long? Yes, most them are, but did you bother to look at the maximum length? NO! Why did you name it “Phone_List” when
    it is nothing but email addresses? emails are not phones.  
    Please read this article so you will know why RDBMS does not use assembly language flags like you are doing. 
    https://www.simple-talk.com/sql/t-sql-programming/bit-of-a-problem/
    It would also help if you know what normalization was. Here is one design that is valid. 
    CREATE TABLE Something_emails 
    (account_id CHAR(15) NOT NULL,
     email_address VARCHAR(256) NOT NULL,
     email_type CHAR(5) NOT NULL
     CHECK (email_type IN ('home', 'work', 'misc')),
     PRIMARY KEY (email_address, email_type)
    >> In this table account_id is unique <<
    No, not without the DDL you did not post.
    >> email values could be NULL or repetitive for work / home / Other (same email can be used more than one columns for account_id) <<
    Not a problem. Look at the primary key.  Also why would anyone store invalid data in a table? SQL programmers try to keep it out! 
    >> a new column will be created with name as Source_flag (the value could be work, Home, Other depend on email coming from) then removes duplicates <<
    More kludges! Oh, putting the comma at the front of a line is how non-SQL mimic punch cards. An SQL progtrqammer would put related subsets of columns on one line – we think in sets! After 30+ years of SQL, this is one of the code smells I use to find bad
    code. 
    --CELKO-- Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
    in Sets / Trees and Hierarchies in SQL

  • Please help to modifiy this query for better performance

    Please help to rewrite this query for better performance. This is taking long time to execute.
    Table t_t_bil_bil_cycle_change contains 1200000 rows and table t_acctnumberTab countains  200000 rows.
    I have created index on ACCOUNT_ID
    Query is shown below
    update rbabu.t_t_bil_bil_cycle_change a
       set account_number =
           ( select distinct b.account_number
             from rbabu.t_acctnumberTab b
             where a.account_id = b.account_id
    Table structure  is shown below
    SQL> DESC t_acctnumberTab;
    Name           Type         Nullable Default Comments
    ACCOUNT_ID     NUMBER(10)                            
    ACCOUNT_NUMBER VARCHAR2(24)
    SQL> DESC t_t_bil_bil_cycle_change;
    Name                    Type         Nullable Default Comments
    ACCOUNT_ID              NUMBER(10)                            
    ACCOUNT_NUMBER          VARCHAR2(24) Y    

    Ishan's solution is good. I would avoid updating rows which already have the right value - it's a waste of time.
    You should have a UNIQUE or PRIMARY KEY constraint on t_acctnumberTab.account_id
    merge rbabu.t_t_bil_bil_cycle_change a
    using
          ( select distinct account_number, account_id
      from  rbabu.t_acctnumberTab
          ) t
    on    ( a.account_id = b.account_id
           and decode(a.account_number, b.account_number, 0, 1) = 1
    when matched then
      update set a.account_number = b.account_number

  • Help rewriting this XMLTable query.

    Hi,
    I rewrote this query:
         SELECT VALUE(k) ts_value,
                s.transactionsetcontrolnumber ts,
                t.xmlintid,
                i.isaid,
                stid,
                g.sendorcode || '!' || g.receivercode || '!' || s.transactionsetid || '!I' geteditpparameter,
                EXTRACTVALUE(VALUE(k), '/TS_850/BEG/BEG03') || '-' ||
                (SELECT N104
                   FROM xmltable('/TS_850/GROUP_5/N1' passing VALUE(k) columns N101
                                 VARCHAR2(2) path 'N101',
                                 N104 VARCHAR2(32) path 'N104')
                  WHERE N101 = 'OB') beg_n104,
                g.sendorcode || '!' || g.receivercode || '!' ||
                (SELECT N103 || '!' || N104
                   FROM xmltable('/TS_850/GROUP_5/N1' passing VALUE(k) columns N101
                                 VARCHAR2(2) path 'N101',
                                 N103 VARCHAR2(32) path 'N103',
                                 N104 VARCHAR2(32) path 'N104')
                  WHERE N101 = 'OB') getedicuststxparameter,
                (SELECT to_date(dtm02, 'YYYYMMDD')
                   FROM xmltable('/TS_850/DTM' passing VALUE(k) columns dtm01
                                 VARCHAR2(3) path 'DTM01',
                                 dtm02 VARCHAR2(32) path 'DTM02')
                  WHERE DTM01 <> '061') requireddate,
                (SELECT SUM(SAC07)
                   FROM xmltable('/TS_850/GROUP_1/SAC' passing VALUE(k) columns
                                 SAC01 VARCHAR2(2) path 'SAC01',
                                 SAC07 VARCHAR2(32) path 'SAC07')
                  WHERE SAC01 = 'A') sumsac07
           FROM edi_xml_int t,
                edi_isa i,
                edi_gs g,
                edi_st s,
                TABLE(XMLSEQUENCE(EXTRACT(x12_850, '/X12/TS_850'))) k
          WHERE s.gsid = g.gsid
            AND g.isaid = i.isaid
            AND t.isaid = i.isaid
            AND s.transactionsetcontrolnumber =
                EXTRACTVALUE(VALUE(k), '/TS_850/ST/ST02')
            AND t.processeddate IS NULL
            AND s.transactionsetid = '850'
            AND TRIM(i.senderid) = '0722717110100'
            and s.updateddate is null order by s.stid;
    Explain Plan for this is:
    | Id  | Operation                          | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT                   |                        |  8077 |    16M|  1056   (2)| 00:00:13 |
    |*  1 |  COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |*  2 |  COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |*  3 |  COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |   4 |  SORT AGGREGATE                    |                        |     1 |     2 |            |       |
    |*  5 |   COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |   6 |  NESTED LOOPS                      |                        |  8077 |    16M|  1056   (2)| 00:00:13 |
    |   7 |   NESTED LOOPS                     |                        |    45 | 95175 |    55   (0)| 00:00:01 |
    |   8 |    NESTED LOOPS                    |                        |    45 |  3510 |     4   (0)| 00:00:01 |
    |   9 |     MERGE JOIN CARTESIAN           |                        |    45 |  2070 |     3   (0)| 00:00:01 |
    |* 10 |      TABLE ACCESS BY INDEX ROWID   | EDI_ST                 |    45 |  1125 |     2   (0)| 00:00:01 |
    |  11 |       INDEX FULL SCAN              | EDI_ST_PK              |    45 |       |     1   (0)| 00:00:01 |
    |  12 |      BUFFER SORT                   |                        |     1 |    21 |     1   (0)| 00:00:01 |
    |  13 |       TABLE ACCESS BY INDEX ROWID  | EDI_ISA                |     1 |    21 |     1   (0)| 00:00:01 |
    |* 14 |        INDEX RANGE SCAN            | EDI_ISA_IX_1           |     1 |       |     0   (0)| 00:00:01 |
    |* 15 |     TABLE ACCESS BY INDEX ROWID    | EDI_GS                 |     1 |    32 |     1   (0)| 00:00:01 |
    |* 16 |      INDEX UNIQUE SCAN             | EDI_GS_PK              |     1 |       |     0   (0)| 00:00:01 |
    |* 17 |    TABLE ACCESS FULL               | EDI_XML_INT            |     1 |  2037 |     1   (0)| 00:00:01 |
    |* 18 |   COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    Predicate Information (identified by operation id):
       1 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
                  VARCHAR2(2) )='OB')
       2 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
                  VARCHAR2(2) )='OB')
       3 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/DTM01')),50,1,2) AS
                  VARCHAR2(3) )<>'061')
       5 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/SAC01')),50,1,2) AS
                  VARCHAR2(2) )='A')
      10 - filter("S"."TRANSACTIONSETID"='850' AND "S"."UPDATEDDATE" IS NULL)
      14 - access(TRIM("SENDERID")='0722717110100')
      15 - filter("G"."ISAID"="I"."ISAID")
      16 - access("S"."GSID"="G"."GSID")
      17 - filter("T"."PROCESSEDDATE" IS NULL AND "T"."ISAID"="I"."ISAID")
      18 - filter("S"."TRANSACTIONSETCONTROLNUMBER"=EXTRACTVALUE(VALUE(KOKBF$),'/TS_850/ST/ST02'))
    Note
       - dynamic sampling used for this statement
    47 rows selected.I rewrote this to this:
    SELECT k.main ts_value,
                s.transactionsetcontrolnumber ts,
                t.xmlintid,
                i.isaid,
                stid,
                g.sendorcode || '!' || g.receivercode || '!' || s.transactionsetid || '!I' geteditpparameter,
                EXTRACTVALUE(k.main, '/TS_850/BEG/BEG03') || '-' ||
                (SELECT N104
                   FROM xmltable('/TS_850/GROUP_5/N1' passing k.main columns N101
                                 VARCHAR2(2) path 'N101',
                                 N104 VARCHAR2(32) path 'N104')
                  WHERE N101 = 'OB') beg_n104,
                g.sendorcode || '!' || g.receivercode || '!' ||
                (SELECT N103 || '!' || N104
                   FROM xmltable('/TS_850/GROUP_5/N1' passing k.main columns N101
                                 VARCHAR2(2) path 'N101',
                                 N103 VARCHAR2(32) path 'N103',
                                 N104 VARCHAR2(32) path 'N104')
                  WHERE N101 = 'OB') getedicuststxparameter,
                (SELECT to_date(dtm02, 'YYYYMMDD')
                   FROM xmltable('/TS_850/DTM' passing k.main columns dtm01
                                 VARCHAR2(3) path 'DTM01',
                                 dtm02 VARCHAR2(32) path 'DTM02')
                  WHERE DTM01 <> '061') requireddate,
                (SELECT SUM(SAC07)
                   FROM xmltable('/TS_850/GROUP_1/SAC' passing k.main columns
                                 SAC01 VARCHAR2(2) path 'SAC01',
                                 SAC07 VARCHAR2(32) path 'SAC07')
                  WHERE SAC01 = 'A') sumsac07
      FROM edi_xml_int t,
           edi_isa i,
           edi_gs g,
           edi_st s,
           xmltable('/X12/TS_850' passing x12_850 columns main xmltype path
                    '/TS_850',
                    st02 varchar2(32) path '/TS_850/ST/ST02') k
    WHERE s.gsid = g.gsid
       AND g.isaid = i.isaid
       AND t.isaid = i.isaid
       AND s.transactionsetcontrolnumber = k.st02
       AND t.processeddate IS NULL
       AND s.transactionsetid = '850'
       AND TRIM(i.senderid) = '0722717110100'
       and s.updateddate is null
    order by s.stid;
    Explain plan for this is:
    | Id  | Operation                          | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT                   |                        |  8077 |    16M|  1056   (2)| 00:00:13 |
    |*  1 |  COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |*  2 |  COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |*  3 |  COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |   4 |  SORT AGGREGATE                    |                        |     1 |     2 |            |       |
    |*  5 |   COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    |   6 |  NESTED LOOPS                      |                        |  8077 |    16M|  1056   (2)| 00:00:13 |
    |   7 |   NESTED LOOPS                     |                        |    45 | 95175 |    55   (0)| 00:00:01 |
    |   8 |    NESTED LOOPS                    |                        |    45 |  3510 |     4   (0)| 00:00:01 |
    |   9 |     MERGE JOIN CARTESIAN           |                        |    45 |  2070 |     3   (0)| 00:00:01 |
    |* 10 |      TABLE ACCESS BY INDEX ROWID   | EDI_ST                 |    45 |  1125 |     2   (0)| 00:00:01 |
    |  11 |       INDEX FULL SCAN              | EDI_ST_PK              |    45 |       |     1   (0)| 00:00:01 |
    |  12 |      BUFFER SORT                   |                        |     1 |    21 |     1   (0)| 00:00:01 |
    |  13 |       TABLE ACCESS BY INDEX ROWID  | EDI_ISA                |     1 |    21 |     1   (0)| 00:00:01 |
    |* 14 |        INDEX RANGE SCAN            | EDI_ISA_IX_1           |     1 |       |     0   (0)| 00:00:01 |
    |* 15 |     TABLE ACCESS BY INDEX ROWID    | EDI_GS                 |     1 |    32 |     1   (0)| 00:00:01 |
    |* 16 |      INDEX UNIQUE SCAN             | EDI_GS_PK              |     1 |       |     0   (0)| 00:00:01 |
    |* 17 |    TABLE ACCESS FULL               | EDI_XML_INT            |     1 |  2037 |     1   (0)| 00:00:01 |
    |* 18 |   COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE |       |       |            |       |
    Predicate Information (identified by operation id):
       1 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
                  VARCHAR2(2) )='OB')
       2 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
                  VARCHAR2(2) )='OB')
       3 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/DTM01')),50,1,2) AS
                  VARCHAR2(3) )<>'061')
       5 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/SAC01')),50,1,2) AS
                  VARCHAR2(2) )='A')
      10 - filter("S"."TRANSACTIONSETID"='850' AND "S"."UPDATEDDATE" IS NULL)
      14 - access(TRIM("SENDERID")='0722717110100')
      15 - filter("G"."ISAID"="I"."ISAID")
      16 - access("S"."GSID"="G"."GSID")
      17 - filter("T"."PROCESSEDDATE" IS NULL AND "T"."ISAID"="I"."ISAID")
      18 - filter("S"."TRANSACTIONSETCONTROLNUMBER"=CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALU
                  E(KOKBF$),'/TS_850/ST/ST02')),50,1,2) AS varchar2(32) ))
    Note
       - dynamic sampling used for this statement
    48 rows selected.Now, I was wondering if you can have just one implementation of XMLTable in the query which will reduce the complexity of this. Both the queries looked like they gave me the same results.
    Thank you,
    Rahul.

    It's quite hard to tune a query without seeing the table structure and available indices as well as relationship between each other but I'll try.
    In your sql which you've given the table alias AD, you have this filter criteria
                  AND    FIELD_NAME IN (                        
                         SELECT FIELD_NAME
                         FROM   APPLICATION_FIELDS                            
                         WHERE  FIELD_TYPE IN ('Checkbox','Radio','Select','SelectM', 'RadioHoriz','RadioPara')
                         ) </br>
    My question is, is FIELD_NAME a column in the APPLICATION_DATA table? If it is, try moving this clause outside of the current sub-query it is in, i.e. one more level up. It looks like you put them inside the wrong level.
    I would also try converting this <COL> IN <SUB-QUERY> to a join, if that wouldn't affect the no. of rows returned. I can't tell for sure since I dont know the relationship between your tables.
    It looks to me like you're doing this
    SELECT <col list>
    FROM   ( SELECT                                         -- LEVEL 1
             FROM   APPLICATION_DATA AD
             WHERE  AD.APPLICAITON_ID IN (                  -- LEVEL 2
                    SELECT
                    FROM   APPLICATIONS A
                    WHERE  A.JOB_ID IN (
                           <SUBQUERY>
                    AND    A.ACCOUNT_ID IN (
                           <SUBQUERY>
                    AND FIELDNAME IN ( -- SHOULD BE INSIDE LEVEL1
    <SUBQUERY>
           ) AD,
           ( SELECT ....
           ) FD
    WHERE  ....

  • HELP TO TUNE THIS QUERY

    Hi,
    I'm using below query in procedure.It's taking more more time can some one help to tune this query or advice to rewrite the query.
    Databse :10.1
    SELECT   'Reading Comprehension' TEST_NAME,T.TEST_END_DATE TEST_SESSION_DATE,
            C.POOL_VERSION_ID, I.CREATED_ON POOL_CREATED_DT,
            C.ITEM_ID, C.ITEM_RESPONSE_ID, S.STUDENT_ID_PK, C.RESPONSE_KEY, C.IS_CORRECT RESPONSE_IS_CORRECT,
            T.SCORE SCALE_SCORE, C.RESPONSE_DURATION, P.ITEM_KEY,
            T.TEST_SESSION_DETAIL_ID, SYSDATE CREATED_ON
           -- BULK COLLECT INTO TV_PSYCHO_DET
            FROM
            CAT_ITEM_PARAMETER P, CAT_ITEM_USER_RESPONSE C, TEST_SESSION_DETAIL T,
            TEST_SESSION S, ITEM_POOL_VERSION I, TEST_DETAIL D
            ,INSTITUTION E
            WHERE  TRUNC(T.TEST_END_DATE) BETWEEN TO_DATE('01-11-09','dd-mm-yy') AND TO_DATE('30-11-09','dd-mm-yy')
            AND D.TEST_NAME =  'Reading Comprehension'
            AND T.TEST_SESSION_STATUS_ID = 3
            AND I.POOL_AVAILABILITY='Y'
            AND P.PRETEST=0 AND C.RESTART_FLAG=0
            AND T.TEST_DETAIL_ID = D.TEST_DETAIL_ID
            AND S.TEST_SESSION_ID = T.TEST_SESSION_ID
            AND C.TEST_SESSION_DETAIL_ID = T.TEST_SESSION_DETAIL_ID
            AND S.INSTITUTION_ID=E.INSTITUTION_ID
            AND SUBSTR(E.INSTITUTION_ID_DISPLAY,8,3) <> '000'
            AND I.ITEM_ID = C.ITEM_ID
            AND P.ITEM_ID = I.ITEM_ID;expln plan
    Plan hash value: 3712814491                                                                                                      
    | Id  | Operation                                 | Name                        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart|
    Pstop |                                                                                                                          
    |   0 | SELECT STATEMENT                          |                             | 50857 |  7151K| 93382   (1)| 00:18:41 |       |
          |                                                                                                                          
    |*  1 |  FILTER                                   |                             |       |       |            |          |       |
          |                                                                                                                          
    |*  2 |   HASH JOIN                               |                             | 50857 |  7151K| 93382   (1)| 00:18:41 |       |
          |                                                                                                                          
    |   3 |    PARTITION HASH ALL                     |                             |  2312 | 23120 |    25   (0)| 00:00:01 |     1 |
        5 |                                                                                                                          
    |*  4 |     TABLE ACCESS FULL                     | CAT_ITEM_PARAMETER          |  2312 | 23120 |    25   (0)| 00:00:01 |     1 |
        5 |                                                                                                                          
    |*  5 |    HASH JOIN                              |                             | 94938 |    12M| 93356   (1)| 00:18:41 |       |
          |                                                                                                                          
    |*  6 |     TABLE ACCESS FULL                     | ITEM_POOL_VERSION           |  9036 |   132K|    30   (0)| 00:00:01 |       |
          |                                                                                                                          
    |*  7 |     TABLE ACCESS BY GLOBAL INDEX ROWID    | CAT_ITEM_USER_RESPONSE      |     9 |   279 |    18   (0)| 00:00:01 | ROWID |
    ROWID |                                                                                                                          
    |   8 |      NESTED LOOPS                         |                             | 45349 |  5270K| 93325   (1)| 00:18:40 |       |
          |                                                                                                                          
    |*  9 |       HASH JOIN                           |                             |  4923 |   423K| 11377   (1)| 00:02:17 |       |
          |                                                                                                                          
    |* 10 |        INDEX FAST FULL SCAN               | INSTI_ID_NAME_COUN_DISP_IDX |  8165 |   111K|    18   (0)| 00:00:01 |       |
          |                                                                                                                          
    |* 11 |        HASH JOIN                          |                             |  4923 |   355K| 11359   (1)| 00:02:17 |       |
          |                                                                                                                          
    |* 12 |         TABLE ACCESS BY GLOBAL INDEX ROWID| TEST_SESSION_DETAIL         |  4107 |   148K|  6804   (1)| 00:01:22 | ROWID |
    ROWID |                                                                                                                          
    |  13 |          NESTED LOOPS                     |                             |  4923 |   278K|  6806   (1)| 00:01:22 |       |
          |                                                                                                                          
    |* 14 |           INDEX RANGE SCAN                | TEST_DETAIL_AK_1            |     1 |    21 |     2   (0)| 00:00:01 |       |
          |                                                                                                                          
    |* 15 |           INDEX RANGE SCAN                | TEST_SESSION_DETAIL_FK2_I   | 39737 |       |   102   (0)| 00:00:02 |       |
          |                                                                                                                          
    |  16 |         PARTITION HASH ALL                |                             |  1672K|    25M|  4546   (1)| 00:00:55 |     1 |
        5 |                                                                                                                          
    |  17 |          TABLE ACCESS FULL                | TEST_SESSION                |  1672K|    25M|  4546   (1)| 00:00:55 |     1 |
        5 |                                                                                                                          
    |* 18 |       INDEX RANGE SCAN                    | CAT_ITEM_USER_RESP_IDX1     |    18 |       |     3   (0)| 00:00:01 |       |
          |                                                                                                                          
    Predicate Information (identified by operation id):                                                                              
       1 - filter(TO_DATE('01-11-09','dd-mm-yy')<=TO_DATE('30-11-09','dd-mm-yy'))                                                    
       2 - access("P"."ITEM_ID"="I"."ITEM_ID")                                                                                       
       4 - filter("P"."PRETEST"=0)                                                                                                   
       5 - access("I"."ITEM_ID"="C"."ITEM_ID")                                                                                       
       6 - filter("I"."POOL_AVAILABILITY"='Y')                                                                                       
       7 - filter(TO_NUMBER("C"."RESTART_FLAG")=0)                                                                                   
       9 - access("S"."INSTITUTION_ID"="E"."INSTITUTION_ID")                                                                         
      10 - filter(SUBSTR("E"."INSTITUTION_ID_DISPLAY",8,3)<>'000')                                                                   
      11 - access("S"."TEST_SESSION_ID"="T"."TEST_SESSION_ID")                                                                       
      12 - filter(TRUNC(INTERNAL_FUNCTION("T"."TEST_END_DATE"))>=TO_DATE('01-11-09','dd-mm-yy') AND "T"."TEST_SESSION_STATUS_ID"=3   
                  AND TRUNC(INTERNAL_FUNCTION("T"."TEST_END_DATE"))<=TO_DATE('30-11-09','dd-mm-yy'))                                 
      14 - access("D"."TEST_NAME"='Reading Comprehension')                                                                           
      15 - access("T"."TEST_DETAIL_ID"="D"."TEST_DETAIL_ID")                                                                         
      18 - access("C"."TEST_SESSION_DETAIL_ID"="T"."TEST_SESSION_DETAIL_ID")                                                         
    43 rows selected.Edited by: user575115 on Dec 18, 2009 12:31 AM

    When you see something like ...
       7 - filter(TO_NUMBER("C"."RESTART_FLAG")=0)                                                                                    It means that Oracle had to do a conversion for you since you aren't using the proper data type in your query.
    That would mean IF there is an index on that column, it won't be useable...

  • 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.

  • This query is taking a long time:

    Hi All,
    I need help in tuning this query. The stats are as below:
    SQL> show parameter user_dump_dest
    NAME                                 TYPE        VALUE
    user_dump_dest                       string      /opt/app/oracle/diag/rdbms/ebi
                                                     zfile/EBIZFILE/trace
    SQL> show parameter optimizer
    NAME                                 TYPE        VALUE
    optimizer_capture_sql_plan_baselines boolean     FALSE
    optimizer_dynamic_sampling           integer     2
    optimizer_features_enable            string      11.2.0.2
    optimizer_index_caching              integer     0
    optimizer_index_cost_adj             integer     100
    optimizer_mode                       string      ALL_ROWS
    optimizer_secure_view_merging        boolean     TRUE
    optimizer_use_invisible_indexes      boolean     FALSE
    optimizer_use_pending_statistics     boolean     FALSE
    optimizer_use_sql_plan_baselines     boolean     TRUE
    SQL> show parameter db_file_multi
    NAME                                 TYPE        VALUE
    db_file_multiblock_read_count        integer     128
    SQL> show parameter db_block_size
    NAME                                 TYPE        VALUE
    db_block_size                        integer     8192
    SQL> show parameter cursor_sharing
    NAME                                 TYPE        VALUE
    cursor_sharing                       string      EXACT
    SQL>
    SQL> column sname format a20
    SQL> column pname format a20
    SQL> column pval2 format a20
    SQL>
    SQL> select
      2  sname, pname, pval1, pval2
      3  from
      4  sys.aux_stats$;
    SNAME                PNAME                     PVAL1 PVAL2
    SYSSTATS_INFO        STATUS                          COMPLETED
    SYSSTATS_INFO        DSTART                          11-03-2009 02:33
    SYSSTATS_INFO        DSTOP                           11-03-2009 02:33
    SYSSTATS_INFO        FLAGS                         1
    SYSSTATS_MAIN        CPUSPEEDNW            714.19791
    SYSSTATS_MAIN        IOSEEKTIM                    10
    SYSSTATS_MAIN        IOTFRSPEED                 4096
    SYSSTATS_MAIN        SREADTIM
    SYSSTATS_MAIN        MREADTIM
    SYSSTATS_MAIN        CPUSPEED
    SYSSTATS_MAIN        MBRC
    SYSSTATS_MAIN        MAXTHR
    SYSSTATS_MAIN        SLAVETHR
    13 rows selected.
    Elapsed: 00:00:00.03
    SQL>
    SQL> explain plan for
      2   SELECT   A.TRANS_NO,
      3            A.TRANS_ID,
      4            A.REQUEST_IND,
      5            A.TRANS_STATUS_IND,
      6            A.TRANS_STATUS_DATE,
      7            A.DELIVERY_DATE,
      8            C.EMAIL_ADDR
      9        FROM     IIS_TRANS_MASTER A, M_TRANS B, IIS_REQUEST_TRANS C
    10       WHERE
    11             C.TRANS_NO = A.TRANS_NO
    12            AND A.TRANS_STATUS_IND = 'P'
    13            AND A.TRANS_ID = B.TRANS_ID
    14            AND A.TRANS_ID <> 'I009'
    15            AND A.TRANS_ID <> 'NPKG'
    16            AND B.TRANS_CO_TYPE = 'I'
    17            AND A.TRANS_ID NOT IN
    18                  ('P012', 'P13B', 'P13C', 'P14B', 'P14C', 'P015')
    19            AND B.DEPT = 'IRD'
    20  ORDER BY     A.CREATED_DATE;
    Explained.
    Elapsed: 00:00:00.01
    SQL>
    SQL> set pagesize 1000;
    SQL> set linesize 170;
    SQL> @/opt/app/oracle/product/11.2.0/rdbms/admin/utlxplp.sql
    SQL> Rem
    SQL> Rem $Header: utlxplp.sql 23-jan-2002.08:55:23 bdagevil Exp $
    SQL> Rem
    SQL> Rem utlxplp.sql
    SQL> Rem
    SQL> Rem Copyright (c) 1998, 2002, Oracle Corporation.     All rights reserved.
    SQL> Rem
    SQL> Rem    NAME
    SQL> Rem      utlxplp.sql - UTiLity eXPLain Parallel plans
    SQL> Rem
    SQL> Rem    DESCRIPTION
    SQL> Rem      script utility to display the explain plan of the last explain plan
    SQL> Rem      command. Display also Parallel Query information if the plan happens to
    SQL> Rem      run parallel
    SQL> Rem
    SQL> Rem    NOTES
    SQL> Rem      Assume that the table PLAN_TABLE has been created. The script
    SQL> Rem      utlxplan.sql should be used to create that table
    SQL> Rem
    SQL> Rem      With SQL*plus, it is recomended to set linesize and pagesize before
    SQL> Rem      running this script. For example:
    SQL> Rem      set linesize 130
    SQL> Rem      set pagesize 0
    SQL> Rem
    SQL> Rem    MODIFIED   (MM/DD/YY)
    SQL> Rem    bdagevil     01/23/02 - rewrite with new dbms_xplan package
    SQL> Rem    bdagevil     04/05/01 - include CPU cost
    SQL> Rem    bdagevil     02/27/01 - increase Name column
    SQL> Rem    jihuang     06/14/00 - change order by to order siblings by.
    SQL> Rem    jihuang     05/10/00 - include plan info for recursive SQL in LE row source
    SQL> Rem    bdagevil     01/05/00 - make deterministic with order-by
    SQL> Rem    bdagevil     05/07/98 - Explain plan script for parallel plans
    SQL> Rem    bdagevil     05/07/98 - Created
    SQL> Rem
    SQL>
    SQL> set markup html preformat on
    SQL>
    SQL> Rem
    SQL> Rem Use the display table function from the dbms_xplan package to display the last
    SQL> Rem explain plan. Use default mode which will display only relevant information
    SQL> Rem
    SQL> select * from table(dbms_xplan.display());
    PLAN_TABLE_OUTPUT
    Plan hash value: 3822676895
    | Id  | Operation                      | Name              | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT               |                   | 38075 |  3123K|       | 22550   (2)| 00:04:31 |
    |   1 |  SORT ORDER BY                 |                   | 38075 |  3123K|  3472K| 22550   (2)| 00:04:31 |
    |*  2 |   HASH JOIN                    |                   | 38075 |  3123K|  2120K| 21801   (2)| 00:04:22 |
    |   3 |    NESTED LOOPS                |                   |       |       |       |            |          |
    |   4 |     NESTED LOOPS               |                   | 38075 |  1673K|       |  4177   (1)| 00:00:51 |
    |*  5 |      TABLE ACCESS FULL         | M_TRANS           |    10 |    80 |       |     7   (0)| 00:00:01 |
    |*  6 |      INDEX RANGE SCAN          | IDX_IIS_TRANS_ID  | 39401 |       |       |   109   (3)| 00:00:02 |
    |*  7 |     TABLE ACCESS BY INDEX ROWID| IIS_TRANS_MASTER  |  3940 |   142K|       |  3186   (1)| 00:00:39 |
    |   8 |    TABLE ACCESS FULL           | IIS_REQUEST_TRANS |  2114K|    78M|       | 12368   (2)| 00:02:29 |
    Predicate Information (identified by operation id):
       2 - access("C"."TRANS_NO"="A"."TRANS_NO")
       5 - filter("B"."DEPT"='IRD' AND "B"."TRANS_CO_TYPE"='I' AND "B"."TRANS_ID"<>'I009' AND
                  "B"."TRANS_ID"<>'NPKG' AND "B"."TRANS_ID"<>'P012' AND "B"."TRANS_ID"<>'P13B' AND
                  "B"."TRANS_ID"<>'P13C' AND "B"."TRANS_ID"<>'P14B' AND "B"."TRANS_ID"<>'P14C' AND
                  "B"."TRANS_ID"<>'P015')
       6 - access("A"."TRANS_ID"="B"."TRANS_ID")
           filter("A"."TRANS_ID"<>'I009' AND "A"."TRANS_ID"<>'NPKG' AND "A"."TRANS_ID"<>'P012' AND
                  "A"."TRANS_ID"<>'P13B' AND "A"."TRANS_ID"<>'P13C' AND "A"."TRANS_ID"<>'P14B' AND
                  "A"."TRANS_ID"<>'P14C' AND "A"."TRANS_ID"<>'P015')
       7 - filter("A"."TRANS_STATUS_IND"='P')
    29 rows selected.
    Elapsed: 00:00:00.02
    SQL>
    SQL> rollback;
    Rollback complete.
    Elapsed: 00:00:00.00
    SQL>
    SQL> rem Set the ARRAYSIZE according to your application
    SQL> set autotrace traceonly arraysize 100
    SQL>
    SQL> alter session set tracefile_identifier = 'mytrace1';
    Session altered.
    Elapsed: 00:00:00.00
    SQL>
    SQL> rem if you're using bind variables
    SQL> rem define them here
    SQL>
    SQL> rem variable b_var1 number
    SQL> rem variable b_var2 varchar2(20)
    SQL>
    SQL> rem and initialize them
    SQL>
    SQL> rem exec :b_var1 := 1
    SQL> rem exec :b_var2 := 'DIAG'
    SQL> set pagesize 1000;
    SQL> set linesize 170;
    SQL> alter session set events '10046 trace name context forever, level 8';
    Session altered.
    Elapsed: 00:00:00.00
    SQL>  SELECT   A.TRANS_NO,
      2            A.TRANS_ID,
      3            A.REQUEST_IND,
      4            A.TRANS_STATUS_IND,
      5            A.TRANS_STATUS_DATE,
      6            A.DELIVERY_DATE,
      7            C.EMAIL_ADDR
      8        FROM     IIS_TRANS_MASTER A, M_TRANS B, IIS_REQUEST_TRANS C
      9       WHERE
    10             C.TRANS_NO = A.TRANS_NO
    11            AND A.TRANS_STATUS_IND = 'P'
    12            AND A.TRANS_ID = B.TRANS_ID
    13            AND A.TRANS_ID <> 'I009'
    14            AND A.TRANS_ID <> 'NPKG'
    15            AND B.TRANS_CO_TYPE = 'I'
    16            AND A.TRANS_ID NOT IN
    17                  ('P012', 'P13B', 'P13C', 'P14B', 'P14C', 'P015')
    18            AND B.DEPT = 'IRD'
    19  ORDER BY     A.CREATED_DATE;
    19 rows selected.
    Elapsed: 00:00:15.44
    Execution Plan
    Plan hash value: 3822676895
    | Id  | Operation                      | Name              | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT               |                   | 38075 |  3123K|       | 22550   (2)| 00:04:31 |
    |   1 |  SORT ORDER BY                 |                   | 38075 |  3123K|  3472K| 22550   (2)| 00:04:31 |
    |*  2 |   HASH JOIN                    |                   | 38075 |  3123K|  2120K| 21801   (2)| 00:04:22 |
    |   3 |    NESTED LOOPS                |                   |       |       |       |            |          |
    |   4 |     NESTED LOOPS               |                   | 38075 |  1673K|       |  4177   (1)| 00:00:51 |
    |*  5 |      TABLE ACCESS FULL         | M_TRANS           |    10 |    80 |       |     7   (0)| 00:00:01 |
    |*  6 |      INDEX RANGE SCAN          | IDX_IIS_TRANS_ID  | 39401 |       |       |   109   (3)| 00:00:02 |
    |*  7 |     TABLE ACCESS BY INDEX ROWID| IIS_TRANS_MASTER  |  3940 |   142K|       |  3186   (1)| 00:00:39 |
    |   8 |    TABLE ACCESS FULL           | IIS_REQUEST_TRANS |  2114K|    78M|       | 12368   (2)| 00:02:29 |
    Predicate Information (identified by operation id):
       2 - access("C"."TRANS_NO"="A"."TRANS_NO")
       5 - filter("B"."DEPT"='IRD' AND "B"."TRANS_CO_TYPE"='I' AND "B"."TRANS_ID"<>'I009' AND
                  "B"."TRANS_ID"<>'NPKG' AND "B"."TRANS_ID"<>'P012' AND "B"."TRANS_ID"<>'P13B' AND
                  "B"."TRANS_ID"<>'P13C' AND "B"."TRANS_ID"<>'P14B' AND "B"."TRANS_ID"<>'P14C' AND
                  "B"."TRANS_ID"<>'P015')
       6 - access("A"."TRANS_ID"="B"."TRANS_ID")
           filter("A"."TRANS_ID"<>'I009' AND "A"."TRANS_ID"<>'NPKG' AND "A"."TRANS_ID"<>'P012' AND
                  "A"."TRANS_ID"<>'P13B' AND "A"."TRANS_ID"<>'P13C' AND "A"."TRANS_ID"<>'P14B' AND
                  "A"."TRANS_ID"<>'P14C' AND "A"."TRANS_ID"<>'P015')
       7 - filter("A"."TRANS_STATUS_IND"='P')
    Statistics
             23  recursive calls
              0  db block gets
         164826  consistent gets
          74235  physical reads
              0  redo size
           1839  bytes sent via SQL*Net to client
            524  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
             19  rows processed
    SQL>
    SQL> disconnect
    Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    Hi Manik,
    1) Not really. Order by may not be required.
    2) After gathering the stats, below is the result:
    NAME_COL_PLUS_SHOW_PARAM                                                         TYPE
    VALUE_COL_PLUS_SHOW_PARAM
    user_dump_dest                                                                   string
    /opt/app/oracle/diag/rdbms/ebizfile/EBIZFILE/trace
    SQL> show parameter optimizer
    NAME_COL_PLUS_SHOW_PARAM                                                         TYPE
    VALUE_COL_PLUS_SHOW_PARAM
    Elapsed: 00:00:00.05
    SQL>  SELECT   A.TRANS_NO,
      2            A.TRANS_ID,
      3            A.REQUEST_IND,
      4            A.TRANS_STATUS_IND,
      5            A.TRANS_STATUS_DATE,
      6            A.DELIVERY_DATE,
      7            C.EMAIL_ADDR
      8        FROM     IIS_TRANS_MASTER A, M_TRANS B, IIS_REQUEST_TRANS C
      9       WHERE
    10             C.TRANS_NO = A.TRANS_NO
    11            AND A.TRANS_STATUS_IND = 'P'
    12            AND A.TRANS_ID = B.TRANS_ID
    13            AND A.TRANS_ID <> 'I009'
    14            AND A.TRANS_ID <> 'NPKG'
    15            AND B.TRANS_CO_TYPE = 'I'
    16            AND A.TRANS_ID NOT IN
    17                  ('P012', 'P13B', 'P13C', 'P14B', 'P14C', 'P015')
    18            AND B.DEPT = 'IRD'
    19  ORDER BY     A.CREATED_DATE;
    20 rows selected.
    Elapsed: 00:00:06.58
    Execution Plan
    Plan hash value: 3822676895
    | Id  | Operation                      | Name              | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT               |                   | 38091 |  3124K|       | 22553   (2)| 00:04:31 |
    |   1 |  SORT ORDER BY                 |                   | 38091 |  3124K|  3472K| 22553   (2)| 00:04:31 |
    |*  2 |   HASH JOIN                    |                   | 38091 |  3124K|  2128K| 21804   (2)| 00:04:22 |
    |   3 |    NESTED LOOPS                |                   |       |       |       |            |          |
    |   4 |     NESTED LOOPS               |                   | 38091 |  1673K|       |  4180   (1)| 00:00:51 |
    |*  5 |      TABLE ACCESS FULL         | M_TRANS           |    10 |    80 |       |     7   (0)| 00:00:01 |
    |*  6 |      INDEX RANGE SCAN          | IDX_IIS_TRANS_ID  | 39418 |       |       |   109   (3)| 00:00:02 |
    |*  7 |     TABLE ACCESS BY INDEX ROWID| IIS_TRANS_MASTER  |  3942 |   142K|       |  3189   (1)| 00:00:39 |
    |   8 |    TABLE ACCESS FULL           | IIS_REQUEST_TRANS |  2114K|    78M|       | 12368   (2)| 00:02:29 |
    Predicate Information (identified by operation id):
       2 - access("C"."TRANS_NO"="A"."TRANS_NO")
       5 - filter("B"."DEPT"='IRD' AND "B"."TRANS_CO_TYPE"='I' AND "B"."TRANS_ID"<>'I009' AND
                  "B"."TRANS_ID"<>'NPKG' AND "B"."TRANS_ID"<>'P012' AND "B"."TRANS_ID"<>'P13B' AND
                  "B"."TRANS_ID"<>'P13C' AND "B"."TRANS_ID"<>'P14B' AND "B"."TRANS_ID"<>'P14C' AND
                  "B"."TRANS_ID"<>'P015')
       6 - access("A"."TRANS_ID"="B"."TRANS_ID")
           filter("A"."TRANS_ID"<>'I009' AND "A"."TRANS_ID"<>'NPKG' AND "A"."TRANS_ID"<>'P012' AND
                  "A"."TRANS_ID"<>'P13B' AND "A"."TRANS_ID"<>'P13C' AND "A"."TRANS_ID"<>'P14B' AND
                  "A"."TRANS_ID"<>'P14C' AND "A"."TRANS_ID"<>'P015')
       7 - filter("A"."TRANS_STATUS_IND"='P')
    Statistics
             17  recursive calls
              0  db block gets
         158643  consistent gets
          49083  physical reads
              0  redo size
           1917  bytes sent via SQL*Net to client
            524  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
             20  rows processedI am yet to try the DBMS_SQLTUNE.
    Are you able to give me in simplified form the steps in executing this query for the DBMS_SQLTUNE? Thanks!

  • Help in rewrite the Query

    Hello
    I have one query taking time to fetch the records. Table contains just 40,000 thousands records but lots of case statement in the query, I just remove lots of case statement there are lot more...
    Can you please help me out to rewrite the query to fetch the records faster. Also Right now there are no indexes on the table....
    SELECT O.cn,
           O.BEN_LAST_NAME,
           O.BEN_FIRST_NAME,
           O.BEN_MI,
           O.SSN,
           O.DOB,
           O.SEX,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 00 AND 34 THEN
               1
              ELSE
               0
           END AS AGE_GROUP0_34_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 35 AND 44 THEN
               1
              ELSE
               0
           END AS AGE_GROUP35_44_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 45 AND 54 THEN
               1
              ELSE
               0
           END AS AGE_GROUP45_54_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 55 AND 59 THEN
               1
              ELSE
               0
           END AS AGE_GROUP55_59_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 60 AND 64 THEN
               1
              ELSE
               0
           END AS AGE_GROUP60_64_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 65 AND 69 THEN
               1
              ELSE
               0
           END AS AGE_GROUP65_69_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 70 AND 74 THEN
               1
              ELSE
               0
           END AS AGE_GROUP70_74_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 75 AND 79 THEN
               1
              ELSE
               0
           END AS AGE_GROUP75_79_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 80 AND 84 THEN
               1
              ELSE
               0
           END AS AGE_GROUP80_84_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 85 AND 89 THEN
               1
              ELSE
               0
           END AS AGE_GROUP85_89_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 90 AND 94 THEN
               1
              ELSE
               0
           END AS AGE_GROUP90_94_F,
           CASE
              WHEN O.SEX = 'F' AND O.AGE BETWEEN 95 AND 00 THEN
               1
              ELSE
               0
           END AS AGE_GROUP95_GT_F,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 00 AND 34 THEN
               1
              ELSE
               0
           END AS AGE_GROUP0_34_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 35 AND 44 THEN
               1
              ELSE
               0
           END AS AGE_GROUP35_44_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 45 AND 54 THEN
               1
              ELSE
               0
           END AS AGE_GROUP45_54_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 45 AND 59 THEN
               1
              ELSE
               0
           END AS AGE_GROUP55_59_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 60 AND 64 THEN
               1
              ELSE
               0
           END AS AGE_GROUP60_64_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 65 AND 69 THEN
               1
              ELSE
               0
           END AS AGE_GROUP65_69_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 70 AND 74 THEN
               1
              ELSE
               0
           END AS AGE_GROUP70_74_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 75 AND 79 THEN
               1
              ELSE
               0
           END AS AGE_GROUP75_79_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 80 AND 84 THEN
               1
              ELSE
               0
           END AS AGE_GROUP80_84_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 85 AND 89 THEN
               1
              ELSE
               0
           END AS AGE_GROUP85_89_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 90 AND 94 THEN
               1
              ELSE
               0
           END AS AGE_GROUP90_94_M,
           CASE
              WHEN O.SEX = 'M' AND O.AGE BETWEEN 95 AND 00 THEN
               1
              ELSE
               0
           END AS AGE_GROUP95_GT_M,
           O.YEAR,
          CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
                            ,mor222 m2 WHERE m1.map_id = hm.map_id_ref
                            AND m2.YEAR = hm.YEAR
                            AND o.cn = m2.cn
                            AND o.YEAR = hm.YEAR
                            AND m1.hcc_model_category1 = 1
                            AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS DISEASE_COEF_HCC1,
          CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
                            ,mor222 m2 WHERE m1.map_id = hm.map_id_ref
                            AND m2.YEAR = hm.YEAR
                            AND o.cn = m2.cn
                            AND o.YEAR = hm.YEAR
                            AND m1.hcc_model_category1 = 2
                            AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS DISEASE_COEF_HCC2,
           CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
                            ,mor222 m2 WHERE m1.map_id = hm.map_id_ref
                            AND m2.YEAR = hm.YEAR
                            AND o.cn = m2.cn
                            AND o.YEAR = hm.YEAR
                            AND m1.hcc_model_category1 = 5
                             AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS       DISEASE_COEF_HCC5,
            CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
                            ,mor222 m2 WHERE m1.map_id = hm.map_id_ref
                            AND m2.YEAR = hm.YEAR
                            AND o.cn = m2.cn
                            AND o.YEAR = hm.YEAR
                            AND m1.hcc_model_category1 = 7
                            AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS      DISEASE_COEF_HCC7,
           CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
                            ,mor222 m2 WHERE m1.map_id = hm.map_id_ref
                            AND m2.YEAR = hm.YEAR
                            AND o.cn = m2.cn
                            AND o.YEAR = hm.YEAR
                            AND m1.hcc_model_category1 = 8
                            AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS       DISEASE_COEF_HCC8                   
      FROM (SELECT T.cn,
                   T.BEN_LAST_NAME,
                   T.BEN_FIRST_NAME,
                   T.BEN_MI,
                   T.SSN,
                   TO_DATE(T.DOB, 'YYYYMMDD') AS DOB,
                   T.SEX,
                   TRUNC(MONTHS_BETWEEN(TO_DATE('01/01/' || T.YEAR, 'MM/DD/YYYY'),
                                        TO_DATE(T.DOB, 'YYYYMMDD')) / 12) AS AGE,
                   T.YEAR
              FROM mor111 T ) O Thanks in advance!
    Kind regards,
    Nik

    Ok, so I am going to be a little bit kinder then your first reply, but not much.
    From what can tell you are doing medical management and are trying to select by AGE/GENDER CELLS and this is common when trying to deal with RBRVS.
    This is by far some of the worst sql I have ever seen, sorry but it just is.
    So please report this either as a new post or as a reply and:
    1. At least post the table definitions and if you can some sample data.
    2. Get rid of almost all the case selectors.
    3. Describe the output you need.
    As it is this is unreadable.
    After that we can talk more.
    Edited by: FlyingGuy on Oct 11, 2011 5:13 PM

  • Rewrite a query

    Hello,
    I would like your help for a query.
    I know that the logic is really bad,but i am not the one who will decide it.
    SELECT
    A.c1
    , B.c1
    , B.c2
    , B.c3
    FROM TABLE1 A
    INNER JOIN Table2 B
    ON B.c4 ='xxx'
    AND B.5 = 'xxxx'
    AND (A.2=B.c6 OR B.c6 = '*' )
    AND (A.3=B.c7 OR B.c7 = '*' )
    How can we rewrite this in order not to bring us a cartesian product?
    I have tried with
    1.case when
    2.union
    but nothing.....
    I really need your help.
    Thanks

    Another one (just to update the duplicate)
    could hardly be faster (maybe on Exadata) than the previous one
    select a.c1,b.c1,b.c2,b.c3
      from (select c1,c2,c3
              from table1
             where c2 != '*'
               and c3 != '*'
           ) a
           (select c1,c2,c3,c6,c7
              from table2
             where c4 = 'xxx'
               and c5 = 'xxxx'
               and c6 != '*'
               and c7 != '*'
           ) b
    where (a.c2 = b.c6)
       and (a.c3 = b.c7)
    union all
    select a.c1,b.c1,b.c2,b.c3
      from (select c1
              from table1
             where c2 = '*'
               and c3 = '*'
           ) a
           (select c1,c2,c3
              from table2
             where c4 = 'xxx'
               and c5 = 'xxxx'
               and c6 = '*'
               and c7 = '*'
           ) bRegards
    Etbin
    Edited by: Etbin on 24.6.2012 8:57

  • Any room for improvement for this query? Explain Plan attached.

    Is there any room for improvement for this query? Table stats are up-to-date. Any suggestions Query rewrite, addition of indexes,...etc ??
    select sum(CONF
                 when (cd.actl_qty - cd.total_alloc_qty - lsd.Q < 0) then
                  0
                 else
                  cd.actl_qty - cd.total_alloc_qty - lsd.Q
               end)
      from (select sum(reqd_qty) as Q, ITEM_ID as ITEM
              from SHIP_DTL SD
             where exists (select 1
                      from CONF_dtl
                     where CONF_nbr = '1'
                       and ITEM_id = SD.ITEM_id)
             group by ITEM_id) lsd,
           CONF_dtl cd
    where lsd.ITEM = cd.ITEM_id
       and cd.CONF_nbr = '1'Total number of rows in the tables involved
    select count(*) from CONF_DTL;
      COUNT(*)
       1785889
    select count(*) from shp_dtl;
      COUNT(*)
        286675
      Explain Plan
    PLAN_TABLE_OUTPUT
    Plan hash value: 2325658044
    | Id  | Operation                           | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT                    |                    |     1 |    39 |     4  (25)| 00:00:01 |
    |   1 |  SORT AGGREGATE                     |                    |     1 |    39 |            |          |
    |   2 |   VIEW                              |                    |     1 |    39 |     4  (25)| 00:00:01 |
    |   3 |    HASH GROUP BY                    |                    |     1 |   117 |     4  (25)| 00:00:01 |
    |   4 |     TABLE ACCESS BY INDEX ROWID     | SHIP_DTL           |     1 |    15 |     1   (0)| 00:00:01
    |   5 |      NESTED LOOPS                   |                    |     1 |   117 |     3   (0)| 00:00:01 |
    |   6 |       MERGE JOIN CARTESIAN          |                    |     1 |   102 |     2   (0)| 00:00:01 |
    |   7 |        TABLE ACCESS BY INDEX ROWID  | CONF_DTL           |     1 |    70 |     1   (0)| 00:00:01 |
    |*  8 |         INDEX RANGE SCAN            | PK_CONF_DTL        |     1 |       |     1   (0)| 00:00:01 |
    |   9 |        BUFFER SORT                  |                    |     1 |    32 |     1   (0)| 00:00:01 |
    |  10 |         SORT UNIQUE                 |                    |     1 |    32 |     1   (0)| 00:00:01 |
    |  11 |          TABLE ACCESS BY INDEX ROWID| CONF_DTL           |     1 |    32 |     1   (0)| 00:00:01 |
    |* 12 |           INDEX RANGE SCAN          | PK_CONF_DTL        |     1 |       |     1   (0)| 00:00:01 |
    |* 13 |       INDEX RANGE SCAN              | SHIP_DTL_IND_6 |     1 |       |     1   (0)| 00:00:01 |
    Predicate Information (identified by operation id):
       8 - access("CD"."CONF_NBR"='1')
      12 - access("CONF_NBR"='1')
      13 - access("ITEM_ID"="SD"."ITEM_ID")
           filter("ITEM_ID"="CD"."ITEM_ID")

    Citizen_2 wrote:
    Is there any room for improvement for this query? Table stats are up-to-date. Any suggestions Query rewrite, addition of indexes,...etc ??You say that the table stats are up-to-date, but is the following assumption of the optimizer correct:
    select count(*)
    from CONF_dtl
    where CONF_nbr = '1';Does this query return a count of 1? I doubt that, but that's what Oracle estimates in the EXPLAIN PLAN output. Based on that assumption you get a cartesian join between the two CONF_DTL table instances, and the result - which is still expected to be one row at most - is then joined to the SHIP_DTL table using a NESTED LOOP.
    If above assumption is incorrect, the number of rows generated by the cartesian join can be tremendous rendering the NESTED LOOP operation quite inefficient.
    You can verify this by using the DBMS_XPLAN.DISPLAY_CURSOR function together with the GATHER_PLAN_STATISTICS hint, if you're already on 10g or later.
    For more information regarding the DISPLAY_CURSOR function, see e.g. here: http://jonathanlewis.wordpress.com/2006/11/09/dbms_xplan-in-10g/
    It will show you the actual cardinalities compared to the estimated cardinalities.
    If the estimate of the optimizer is incorrect, you should find out why. There still might be some issues with the statistics, since this is most obvious reason for incorrect estimates.
    Are your index statistics up-to-date?
    Regards,
    Randolf
    Oracle related stuff blog:
    http://oracle-randolf.blogspot.com/
    SQLTools++ for Oracle (Open source Oracle GUI for Windows):
    http://www.sqltools-plusplus.org:7676/
    http://sourceforge.net/projects/sqlt-pp/

Maybe you are looking for

  • ITunes 7.5 and OSX 10.4.11 - CANNOT CONNECT TO iTUNES STORE

    After a recent upgrade to iTunes 7.5 and OSX 10.4.11, I can no longer connect to the iTunes store. I have tried reinstalling iTunes 7.5 (and Quicktime - just in case!). I have also tried Keychain First Aid. Still it is broken. Please help me with thi

  • Ipod classic not recognized in itunes because of ipodservice.exe

    My ipod classic (80gb) is frequently not recognized in itunes 11 running on Windows 8 unless I close itunes, eject the ipod using windows, stop ipodservice.exe (64 bit) using task manager, and restart itunes. Anybody know of a more permanent fix?

  • How do I change back the print pages box?

    I refreshed Firefox and my print pages box changed. It went from having a long box allowing me to type in say the 1-3, 6,10 pages to two small "from" & "to" boxes. I really need this back to the way it was for my business. I checked IE and that print

  • How to use CHANGEDOCU functions for audit trail?

    Hi, I have a report screen that requires audit trails on the changes made to the data dic fields on the screen. Which CHANGEDOCU functions should I use for audit trail? And where should I implement the functions? In the 'save' subrountine that I crea

  • Is Forms10g web based or web enabled ?

    Hello every body. I want to know if Oracle Forms10g is web based or web enabled ? BTW: what is the difference between both terms ? Yours