Sql 如何将用户定义的函数替换为SELECT子句?
我的查询中有一个性能问题,需要2分钟以上才能执行。目前,主表f_trans有300万条记录 我在where子句和join条件中索引了列 查询: 功能: 能帮我把函数重新组织成select子句吗 和ftr.v_日期>='2014年8月24日'Sql 如何将用户定义的函数替换为SELECT子句?,sql,oracle,performance,sql-tuning,Sql,Oracle,Performance,Sql Tuning,我的查询中有一个性能问题,需要2分钟以上才能执行。目前,主表f_trans有300万条记录 我在where子句和join条件中索引了列 查询: 功能: 能帮我把函数重新组织成select子句吗 和ftr.v_日期>='2014年8月24日' 和ftr.v_日期谢谢lalit。我已修改,但问题仍然存在。按要求发布执行计划。我无法将计划添加为映像:映像不是必需的。请参阅我的更新以了解如何发布执行计划。我已发布了执行计划执行以下操作,解释计划,然后从TABLEDBMS_XPLAN.DISPLAY中选择
和ftr.v_日期谢谢lalit。我已修改,但问题仍然存在。按要求发布执行计划。我无法将计划添加为映像:映像不是必需的。请参阅我的更新以了解如何发布执行计划。我已发布了执行计划执行以下操作,解释计划,然后从TABLEDBMS_XPLAN.DISPLAY中选择*。。将输出粘贴到此处。。
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 |
-------------------------------------------------------------------------------------------
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> 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>