2014-01-17 114 views
0

以下查詢正在執行約30秒。我無法找到瓶頸。請幫助我提高性能。使用左連接優化查詢

SELECT 'Beginning Balance' AS TYPE, 
     COUNT(DISTINCT lmt.lmt_corp_id) , 
     COUNT(DISTINCT ldt.ldt_clnt_id) , 
     COUNT(DISTINCT ldt.ldt_guar_id) , 
     COUNT(DISTINCT ldt.ldt_loan_ref_id), 
     COUNT(ldt.ldt_line_item_id) , 
     SUM(ldt.ldt_princpal_bal) , 
     SUM(ldt.ldt_fund_amt), 
     SUM(ldt.ldt_princpal_bal) - SUM(ldt.ldt_fund_amt), 
     SUM(pay.PaidPrinc), 
     SUM(pay.PaidInt), 
     SUM(pay.PaidOther), 
     SUM(pay.TotalPmt), 
     SUM(fn_get_line_pb_by_date(ldt.ldt_line_item_id, '2014-01-16', 'BOD')), 
     sum(ovr.OPAmt), 
FROM ldt_tran_loan_det ldt 
JOIN lmt_mst_loan lmt 
    ON ldt.ldt_loan_ref_id = lmt.lmt_loan_id AND 
    ldt.ldt_clnt_id IN (262,75,191,49,267,277,23,79) 
LEFT JOIN tmp_pmt pay ON pay.LineItemId = ldt.ldt_line_item_id 
LEFT JOIN tmp_over_pmt ovr ON ovr.LineItemId = ldt.ldt_line_item_id 
LEFT JOIN lct_tran_loan_close lct 
     ON lct.lct_line_item_id = ldt.ldt_line_item_id 
WHERE DATE(ldt.ldt_funded_date) < '2014-01-16' AND 
     (ldt.ldt_status != 'PIF' OR 
     (ldt.ldt_status = 'PIF' AND ldt.ldt_last_pmt_date >= '2014-01-16')) AND 
     (lct.lct_hff_entry_date IS NULL OR 
     (DATE(lct.lct_hff_entry_date) >= '2014-01-16' AND 
     lct.lct_txn_type IN ('REC','RCL'))) 

DDL:

CREATE TABLE `ldt_tran_loan_det` 
(`ldt_line_item_id` bigint(20), 
    `ldt_loan_ref_id` int(11) , 
    `ldt_clnt_id` int(11) , 
    `ldt_guar_id` int(11) , 
    `ldt_princpal_bal` decimal(20,2) , 
    `ldt_fund_amt` decimal(20,2) , 
    `ldt_funded_date` datetime , 
    `ldt_last_pmt_date` date , 
    PRIMARY KEY (`ldt_line_item_id`)); 

CREATE TABLE `lmt_mst_loan` (`lmt_loan_id` int(11), `lmt_corp_id` int(11)); 

CREATE TABLE `tmp_pmt` 
(`PaidPrinc` decimal(20,2), 
`PaidInt` decimal(20,2), 
`PaidOther` decimal(20,2), 
`TotalPmt` decimal(20,2), 
`LineItemId` int(11)); 

CREATE TABLE `tmp_over_pmt` (`OPAmt` decimal(20,2),`LineItemId` int(11)); 

CREATE TABLE `lct_tran_loan_close` 
(`lct_line_item_id` bigint(20), 
`lct_txn_type`char(20) , 
`lct_hff_entry_date` datetime); 

下面是執行計劃: enter image description here

+1

您的數據庫統計數據是否是最新的 - 除了lmt_mst_loan之外,您的所有表格是否真的只有1或2條記錄?如果不是,請嘗試更新數據庫統計信息。 –

+0

感謝您的評論。是的,我已經優化了我的桌子,但仍然需要同一時間。我的表中有超過30萬條記錄。 –

+0

你可以發佈更新的執行計劃嗎? –

回答

2

這不是最終的解決辦法,但只有1點改進:
上ldt_funded_date列上創建索引。不要使用date()函數,因爲它不會使用索引。取而代之的是使用ldt.ldt_funded_date <'2014-01-16 00:00:00'

+0

另外,請確保您已完成用於連接的列以及條件列的索引。 – Krishna

+0

是的,我以前做過,但沒用! –

+0

+1從不在行上使用日期。相反,請始終將列值與生成的值(但是查詢的常量)進行比較。 – Bohemian