簡體   English   中英

Oracle SQL查詢優化(左連接,索引)

[英]Oracle SQL Query Optimization (Left joins, indexes)

在左連接集中添加表時,以下查詢會卡住。 如果排除最后一個連接,則查詢將平滑運行。 但如果包含最后一次加入,則會卡住 我也嘗試了ALL_ROWS,FIRST_ROWS優化器提示。 對於'20190404',cps_taskhis有大約5500個預期行。

筆記:

  • 表cpsmgt.cps_orderhis.orderid是索引列。 {screenshot 1}。

  • 表cpsmgt.cps_taskhis.orderid也是一個索引列,它在最后一個左連接中連接到cpsmgt.cps_orderhis.orderid。 {screenshot 2}

屏幕截圖1: 在此輸入圖像描述

屏幕截圖2: 在此輸入圖像描述 SQL查詢

SELECT /*FIRST_ROWS*/
    t.taskid task_no,
    t.orderid order_id,
    DECODE(t.priority,50,'Low',100,'Medium',200,'High','Other') task_priority,
    t.taskname task_name,
    TO_CHAR(t.createtime,'HH24') creation_hour,
    t.createtime create_time,
    t.completedtime completed_time,
    ( to_timestamp(t.completedtime,'yyyy-mm-dd hh24:mi:ss') - to_timestamp(t.createtime,'yyyy-mm-dd hh24:mi:ss') ) time_difference,
    op1.user_name initiator_login,
    rd1.name role_assigned_maker,
    op2.user_name checker_login,
    rd2.name role_assigned_checker,
    t.taskstate task_state,
    t.tasktype task_type,
    t.description task_description,
    ord_comment.commenttext,  -- 2048 byte varchar2
    sim.msisdn target_msisdn, 
    o.reason reason_of_task,  -- 2048 byte varchar2
    DECODE(t.bussinesscategory,'0','Business Operation','1','Transaction and Action','2','Financial','3','Manual Task','4','Bulk','5'
,'Configuration','Others:'
    || t.bussinesscategory) businesscategory_of_task
FROM
    cpsmgt.cps_taskhis t --PARTITION ( SYS_P30212 ) t
    LEFT JOIN cpsmgt.cps_operator op1 ON op1.operator_id = t.createid
    LEFT JOIN cpsmgt.cps_operator op2 ON op2.operator_id = t.ownerid
    LEFT JOIN cpsmgt.cps_role_operator ro1 ON op1.operator_id = ro1.operator_id
                                              AND op1.status <> '06'
    LEFT JOIN cpssys.cps_role_def rd1 ON rd1.role_id = ro1.role_id
                                         AND rd1.status = '30'
    LEFT JOIN cpsmgt.cps_role_operator ro2 ON op2.operator_id = ro2.operator_id
                                              AND op2.status <> '06'
    LEFT JOIN cpssys.cps_role_def rd2 ON rd2.role_id = ro2.role_id
                                         AND rd2.status = '30'
    LEFT JOIN cpsmgt.cps_order_comment ord_comment ON t.orderid = ord_comment.orderid
    LEFT JOIN cpsmgt.cps_sim_device sim ON t.on_identity_id = sim.identity_id
    LEFT JOIN cpsmgt.cps_orderhis o ON t.orderid = o.orderid
WHERE
    t.createtime BETWEEN TO_DATE(TO_CHAR(20190404)
    || ' 00:00:00','yyyy-mm-dd hh24:mi:ss') AND TO_DATE(TO_CHAR(20190404)
    || ' 23:59:59','yyyy-mm-dd hh24:mi:ss')
    AND   t.procdefid IN (
        'IC_EditP2PMSISDNWorkflow',
        'IC_ResetCustomerPinWorkflow',
        'TC_TransactionConfirmWorkflow',
        'IC_ChangeCustomerProductWorkflow',
        'IC_EditG2PMSISDNWorkflow',
        'IC_ChangeCustomerIdentityStatusWorkflow',
        'TC_CancelRemittanceWorkflow',
        'IC_ChangeCustomerMSISDNWorkflow',
        'IC_ResetOrgOperatorPINWorkflow',
        'IC_MigrateCustTrustL1Workflow',
        'IC_MigrateCustTrustL2Workflow',
        'IC_ChangeCustomerIdentityKYCWorkflow',
        'IC_UnblockPaymentTransactionWorkflow',
        'IC_ResetOrgOperatorPasswordWorkflow'
    )
    AND   rd1.name IN (
        'Complaints (Maker)',
        'MFS 1344 Help Line',
        'MFS 4444 Helpline',
        'Operator user(back end user) maker',
        'Complaints Checker',
        'Operator user(back end user) completer'
    )
    AND   rd2.name IN (
        'Complaints (Maker)',
        'MFS 1344 Help Line',
        'MFS 4444 Helpline',
        'Operator user(back end user) maker',
        'Complaints Checker',
        'Operator user(back end user) completer'
    );

查詢說明計划(SQL Developer):(將文件另存為html並在瀏覽器中打開)

https://drive.google.com/open?id=1KBnhETTzgNLRUh7djyfCN-Wo5QxPZTfb

重要說明:我正在嘗試將輸出插入臨時表。 相反,如果我使用create table as將此數據插入到新表中。 相同的查詢工作正常:-(

-- previous columns
   (
        SELECT 
            o.reason
        FROM
            cpsmgt.cps_orderhis o
        WHERE
            o.orderid = t.orderid
    ) reason_of_task,
-- rest of the query.

你試過以下提示嗎?

/*+ INDEX(o IDX_CPS_ORDERHIS_3) USE_NL(o t)*/

也許OPTIMIZER沒有選擇正確的索引並為執行計划選擇USE_HASH。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM