Oracle11g 如何使用GROUPBY子句简化SQL内部联接以提高Oracle的性能

Oracle11g 如何使用GROUPBY子句简化SQL内部联接以提高Oracle的性能,oracle11g,Oracle11g,我在用甲骨文 我有一个连接查询来从多个表中获取数据。但是这个查询需要更长的时间来获取数据 那么,有没有人可以帮我用另一种省时的方式编写这个查询 查询如下: SELECT CP.ACCOUNTNUMBER,GL.ACCOUNTNAME, CASE WHEN NVL(SUM(TE.Debit * TE.BASECURRENCYEXCHANGERATE),0)-NVL(SUM(TE.Credit * TE.BASECURREN

我在用甲骨文 我有一个连接查询来从多个表中获取数据。但是这个查询需要更长的时间来获取数据

那么,有没有人可以帮我用另一种省时的方式编写这个查询

查询如下:

 SELECT CP.ACCOUNTNUMBER,GL.ACCOUNTNAME,
                CASE
                     WHEN NVL(SUM(TE.Debit * TE.BASECURRENCYEXCHANGERATE),0)-NVL(SUM(TE.Credit * TE.BASECURRENCYEXCHANGERATE),0)>0
                     THEN NVL(SUM(TE.Debit * TE.BASECURRENCYEXCHANGERATE),0) - NVL(SUM(TE.Credit * TE.BASECURRENCYEXCHANGERATE),0)
                     ELSE 0
                     END AS DEBIT,
                CASE
                     WHEN NVL(SUM(te.Credit * TE.BASECURRENCYEXCHANGERATE),0) - NVL(SUM(te.Debit * TE.BASECURRENCYEXCHANGERATE),0) > 0
                     THEN NVL(SUM(te.Credit * TE.BASECURRENCYEXCHANGERATE),0) - NVL(SUM(te.Debit * TE.BASECURRENCYEXCHANGERATE),0)
                     ELSE 0
                     END AS Credit
         FROM        CPOACCOUNTS CP
         INNER JOIN  GLACCOUNTS GL
         ON          GL.ACCOUNTID=CP.ACCOUNTID
         INNER JOIN  TRANSACTIONENTRIES TE
         ON          GL.ACCOUNTID=TE.GLACCOUNTID
         INNER JOIN  TRANSACTIONS TR
         ON          TR.TRANSACTIONID=TE.TRANSACTIONID

         WHERE       TR.DATECREATED<='13-Aug-2018'
         GROUP BY    CP.ACCOUNTNUMBER,GL.ACCOUNTNAME
         ORDER BY    CP.ACCOUNTNUMBER,GL.ACCOUNTNAME;
选择CP.ACCOUNTNUMBER、GL.ACCOUNTNAME、,
案例
当NVL(总和(借方*基础货币兑换率)为0)-NVL(总和(贷方*基础货币兑换率)为0时>0
然后NVL(总和(借方*基础货币兑换率),0)-NVL(总和(贷方*基础货币兑换率),0)
其他0
以借方形式结束,
案例
当NVL(总和(贷方*基础货币兑换率)为0)-NVL(总和(借方*基础货币兑换率)为0时>0
然后NVL(总和(贷方*基础货币兑换率),0)-NVL(总和(借方*基础货币兑换率),0)
其他0
以信用结束
来自CPOAAccounts CP
内连接玻璃幕墙
在GL.ACCOUNTID=CP.ACCOUNTID上
内部联接事务入口
在总账上,ACCOUNTID=TE.GLACCOUNTID
内部连接事务
在TR.TRANSACTIONID=TE.TRANSACTIONID上

其中TR.DATECREATED您可以使用自然连接来提高性能。 或
提高性能的另一种方法是对这些列使用索引。

您有哪些索引?解释计划在哪里?tr.datecreated列的数据类型是什么?如果它是日期数据类型,那么您应该将日期作为字符串转换为日期,例如
转换为日期('13/08/2018',dd/mm/yyyy')
,或者甚至
trunc(sysdate)
,如果您每天运行查询。@Boneist,尝试使用这些函数,但没有任何更改!请更新您的问题,以包括查询的执行计划,以及有关表的更多信息。例如,gl.accountid和ate.glaccountid之间以及tr.transactionid和te.transactionid之间是否存在一对一的关系?我建议不要使用自然连接而不是OP使用的内部连接;自然联接假定两个表中具有相同名称的所有列都是联接的一部分,这可能不是所需的,并且如果向其中一个表中添加了与另一个表中的列具有相同名称的额外列,则会导致查询更改。