I am new to SQL performance tuning. Below is the query that I need to enhance. Can someone please guide me on what or where should I start improving this query. I can only tweak this on query level, I am not allowed to alter the tables used in this SQL.
- This is running on Oracle 12g.
- This query is running for almost 10 hrs.
- If possible, I want to make this query runs significantly with lower runtime.
    cursor cursor2 is --logic 2
        SELECT /*+ PARALLEL (PRD, 36) */ 
               AST.ASSET_NUM                                  
            ,AST.STATUS_CD                                  
            ,PRD.NAME                                      
            ,PR_ATTR.CHAR_VAL                               
            ,U_ATTR.CHAR_VAL                             
            ,SRV_AD.ADDR                                 
            ,SRV_AD.ADDR_LINE_2                          
            ,SRV_AD.CITY                                 
            ,UPPER(SRV_AD.STATE)                         
            ,SRV_AD.ZIPCODE                              
            ,SRV_AD.COUNTRY                              
            ,CX_ACT.OU_NUM                               
            ,CX_ACT.X_CCNA_ACNA_FRP                      
            ,CX_ACT.NAME                                 
            ,CX_ACT.OU_TYPE_CD                           
            ,CX_ACT_x.ATTRIB_46                          
            ,BILL_ACCT.OU_NUM                               
            ,DECODE(LIFE_LINE.LIFE_ELIG_FLG, 'Y', 'Y', 'N') 
            ,SR_AC_X.X_LOC_NUM                          
            ,SR_AC_X.X_BOOTH_LOC                        
            ,SR_AC_X.X_COINLESS_IND                     
            ,SERV_ACCT.X_WIRE_CENTER_FRP                    
            ,SALES_ORD.ORDER_NUM                            
            ,SALES_ORD_X.ATTRIB_06 
                ,TO_CHAR(GREATEST ( NVL(AST.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(PRD.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(PR_ATTR.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(U_ATTR.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(SERV_ACCT.LAST_UPD, TO_DATE('01011900', 
    'MMDDYYYY'))
                                , NVL(SR_AC_X.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(SRV_AD.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(CX_ACT.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(CX_ACT_X.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(LIFE_LINE.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))
                                , NVL(BILL_ACCT.LAST_UPD, TO_DATE('01011900', 'MMDDYYYY'))), 'DD-MM-YYYY HH24:MI:SS')
            ,CA.NC                                     
            ,CA.NCI                                    
            ,CA.SECNCI                                 
            ,CA.NC1                                    
            ,CA.ACT                                    
            ,CA.SPEC                                   
            ,CA.PIU                                    
            ,CA.ACTI                                   
            ,CA.CCNA                                   
          FROM A.S_ASSET     AST
             , A.S_PRD_INT  PRD
             , A.S_ASSET_XA  PR_ATTR
             , A.S_ASSET_XA  U_ATTR
             , A.S_ORG_EXT   SERV_ACCT
             , A.S_ORG_EXT_X SR_AC_X
             , A.S_ADDR_PER  SRV_AD
             , A.S_ORG_EXT   CX_ACT
             , A.S_ORG_EXT_X CX_ACT_X
             , A.S_SUBSIDY   LIFE_LINE
             , A.S_ORG_EXT   BILL_ACCT
             , A.S_BU        BU
             , A.S_ORDER     SALES_ORD
             , A.S_ORDER_X   SALES_ORD_X
             , B.CAMP_TEMP_XA CA
         WHERE AST.ROW_ID = CA.ASSET_ROW_ID (+)
           AND AST.ROW_ID           = AST.ROOT_ASSET_ID
           AND (AST.PRD_ID          = PRD.ROW_ID        AND PRD.part_num IN ('R', 'B', 'R_D', 'B_D', 'ND'))
           AND (AST.ROW_ID          = PR_ATTR.ASSET_ID    AND PR_ATTR.ATTR_NAME = 'NUMBER')
           AND (AST.ROW_ID          = U_ATTR.ASSET_ID  AND U_ATTR.ATTR_NAME = 'UNIVERSE')
           AND AST.SERV_ACCT_ID     = SERV_ACCT.ROW_ID (+)
           AND SERV_ACCT.PAR_ROW_ID = SR_AC_X.PAR_ROW_ID (+)
           AND SERV_ACCT.PR_ADDR_ID = SRV_AD.ROW_ID (+)
           AND AST.OWNER_ACCNT_ID   = CX_ACT.ROW_ID (+)
           AND CX_ACT.PAR_ROW_ID = CX_ACT_X.PAR_ROW_ID (+)
           AND CX_ACT.ROW_ID     = LIFE_LINE.ACCNT_ID (+)
           AND AST.X_FIRST_ORDER_NUM = SALES_ORD.ROW_ID (+)
           AND SALES_ORD.ROW_ID     = SALES_ORD_X.PAR_ROW_ID (+)
           AND AST.BILL_ACCNT_ID    = BILL_ACCT.ROW_ID (+)
           AND SERV_ACCT.BU_ID      = BU.ROW_ID
       AND UPPER(SRV_AD.STATE) IN ( 'AB', 'CD', 'EF')
       AND PR_ATTR.CHAR_VAL IS NOT NULL
           AND BU.NAME <> 'WS';
 
    