【问题标题】:PL\SQL Query Optimization (currently slow)PL\SQL 查询优化(目前较慢)
【发布时间】:2025-11-23 09:30:01
【问题描述】:

我想知道社区是否可以帮助我优化此查询但获得相同的结果。目前,返回大约需要 22 分钟。我尝试了一些不同的方法,但花费的时间更长。

感谢任何帮助!

GL_TYPE - SIZE 1MB 2409 ROWS
GL_DEFINITION - SIZE 1MB 53 ROWS
GL_JOURNAL - SIZE 1.24GB 5,725,500 or greater ROWS


  SELECT MAX (CT.ENTITY_ID) ENTITY_ID,
         MAX (CT.CASH_TYPE) RULE_CODE,
         SUM (
            (SELECT NVL (SUM (JB.CLOSING_BALANCE), 0)
               FROM GL_JOURNAL JB
              WHERE     JB.GL_PRIME_ACCT = CD.GL_PRIME_ACCT
                    AND JB.GL_SUB_ACCT = CD.GL_SUB_ACCT
                    AND JB.ENTITY_ID = CT.ENTITY_ID
                    AND JB.GL_SYS_PERIOD = '201509'
                    AND JB.GL_BASIS = 'NA'
                    AND JB.GL_SOURCE <> '000')) as BEG_BALANCE
    FROM GL_TYPE CT, GL_DEFINITION CD
   WHERE CT.TYPE_CODE = CD.TYPE_CODE
GROUP BY CT.ENTITY_ID, CT.TYPE_CODE



 SELECT STATEMENT
 COST 7
   SORT AGGREGATE
   BYTES: 45 Cardinality: 1
        TABLE ACCESS BY INDEX ROWID TABLE GL_JOURNAL
        COST 10 BYTES: 45 Cardinality: 10
        INDEX RANGE SCAN INDEX
        COST 3 Cardinality: 14

       HASH GROUP BY
       COST 7 BYTES: 69,861 CARDINALITY:2,409

       #HASH JOIN
            COST 5 BYTES: 412,467 CARDINALITY:14,223
               INDEX FULL SCAN INDEX (UNIQUE)
               COST 1: BYTES: 848 CARDINALITY:53
               INDEX FAST FULL SCAN INDEX (UNIQUE)
               COST 3 BYTES:31,317 CARDINALITY:2,409

【问题讨论】:

  • fyi,这个问题与 PL/SQL 或 plsqldeveloper 标签无关。也许sql-tuning 会更合适。

标签: sql oracle11g plsqldeveloper


【解决方案1】:

我怀疑将子查询移动到 from 子句会是一个胜利:

SELECT MAX(CT.ENTITY_ID) as ENTITY_ID,
       MAX(CT.CASH_TYPE) as RULE_CODE,
       COALESCE(SUM(JB.CLOSING_BALANCE), 0) as BEG_BALANCE
FROM GL_TYPE CT JOIN
     GL_DEFINITION CD
     ON CT.TYPE_CODE = CD.TYPE_CODE LEFT JOIN
     GL_JOURNAL JB
     ON JB.GL_PRIME_ACCT = CD.GL_PRIME_ACCT AND
        JB.GL_SUB_ACCT = CD.GL_SUB_ACCT AND
        JB.ENTITY_ID = CT.ENTITY_ID AND
        JB.GL_SYS_PERIOD = '201509' AND
        JB.GL_BASIS = 'NA' AND
        JB.GL_SOURCE <> '000'
GROUP BY CT.ENTITY_ID, CT.TYPE_CODE;

此查询还想利用索引:GL_TYPE(TYPE_CODE)GL_DEFINITION(TYPE_CODE)GL_JOURNAL(GL_PRIME_ACCT, GL_SUB_ACCT, ENTITY_ID, GL_SYS_PERIOD, GL_BASIS, GL_SOURCE, CLOSING_BALANCE)

【讨论】:

  • 我试试这个,很有意义。我会进行一些测试。感谢您的帮助。
  • 它奏效了,我认为它是成功的。非常感谢!
  • @Christopher:如果答案对您有用,请将其标记为“已接受答案”。这将表扬 Gordon,但也向其他人表明,您关心您获得的帮助。