2014-10-08 64 views
0

我的查詢性能問題需要超過2分鐘才能執行。目前主表f_trans有300萬條記錄。如何將用戶定義的函數替換爲SELECT子句?

我有where子句和連接條件的索引列。

查詢:

SELECT f.no AS refno, 
       f.v_date AS v_date, 
       (SELECT fnbalance 
            ( 
             f.acnt_code, 
             f.v_date,          
            ) 
        FROM DUAL) AS balance, 

     FROM f_trans f JOIN glr_temp glr 
      ON f.acnt_code = glr.acnt_code 
      AND ftr.v_date >= '24-Aug-2014' 
      AND ftr.v_date <= '27-Aug-2014' 
       JOIN glm_gl_mast glm 
       ON f.acnt_code = glm.acnt_code 
      AND glr.acnt_code = glm.acnt_code; 

功能:

CREATE OR REPLACE function fnbalance ( 
p_glcode in number,p_dtdate in date, 
) 
    return number 
as 
    openbal number; 
    dramt  number; 
    cramt  number; 

begin 

    dramt := 0; 
    cramt := 0; 
    balamt := 0; 
        select nvl (sum (f.dr_amt), 0), nvl (sum (f.cr_amt), 0) 
        into dramt, cramt 
        from ftrans ftr 
        where f.v_source <> 'FFT'  
        and f.acnt_code = p_glcode 
        and ftr.ftr_vou_date < p_dtdate; 

    select nvl((dramt - cramt),0) into balamt from dual; 
    return balamt; 
end 


    Plan hash value: 1037159964 

------------------------------------------------------------------------------------------- 
| Id | Operation    | Name    | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |     | 53 | 1537 | 23581 (1)| 00:04:43 | 
| 1 | FAST DUAL    |     |  1 |  |  2 (0)| 00:00:01 | 
|* 2 | HASH JOIN    |     | 53 | 1537 | 23581 (1)| 00:04:43 | 
|* 3 | HASH JOIN   |     | 7342 | 73420 | 12 (9)| 00:00:01 | 
| 4 | INDEX FAST FULL SCAN| IND_GLR_ACC  | 5214 | 26070 |  5 (0)| 00:00:01 | 
| 5 | INDEX FAST FULL SCAN| GLM_AC_INDEX  | 7342 | 36710 |  6 (0)| 00:00:01 | 
|* 6 | TABLE ACCESS FULL | F_TRANS | 181K| 3364K| 23568 (1)| 00:04:43 | 
------------------------------------------------------------------------------------------- 

能幫我重新組織功能爲SELECT子句?

+0

執行以下操作,'解釋計劃',然後'SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)''..將輸出粘貼在此處.. – 2014-10-08 12:00:54

回答

1

AND ftr.v_date> = '24 -Aug-2014'
AND ftr.v_date < = '27 -Aug-2014'

首先,比較一日期的這種方式用文字太糟糕了。 v_date是一個DATE數據類型,您必須將其與日期而不是文字進行比較。使用TO_DATE將文字轉換爲日期。

AND ftr.v_date >= TO_DATE('24-Aug-2014', 'DD-Mon-YYYY') 
AND ftr.v_date <= TO_DATE('27-Aug-2014', 'DD-Mon-YYYY') 

說給自己,從不依靠隱式數據轉換。總是明確地做。

請發佈查詢的執行計劃以進一步瞭解性能是否可以提高。

更新

請參閱如何在SQL生成執行計劃* Plus的

SQL> explain plan for select * from dual; 

Explained. 

SQL> select * from table(dbms_xplan.display); 

PLAN_TABLE_OUTPUT 
-------------------------------------------------------------------------------- 
Plan hash value: 272002086 

-------------------------------------------------------------------------- 
| Id | Operation   | Name | Rows | Bytes | Cost (%CPU)| Time  | 
-------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |  |  1 |  2 |  2 (0)| 00:00:01 | 
| 1 | TABLE ACCESS FULL| DUAL |  1 |  2 |  2 (0)| 00:00:01 | 
-------------------------------------------------------------------------- 

8 rows selected. 

SQL> 

複製粘貼的執行計劃,並使用代碼標記保存格式張貼在這裏。

+0

謝謝lalit。我已修改,但問題仍然存在。 – saran 2014-10-08 10:32:11

+1

根據請求發佈執行計劃。 – 2014-10-08 10:37:16

+0

我無法將我的計劃添加爲圖片:( – saran 2014-10-08 11:53:57

相關問題