2015-10-17 3 views
2

Мне было интересно, может ли сообщество помочь мне оптимизировать этот запрос, но достичь тех же результатов. В настоящее время требуется около 22 минут для возвращения. Я попробовал несколько разных вещей, но они заняли больше времени.PL SQL Оптимизация запросов (в настоящее время медленная)

Любая помощь приветствуется!

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 
+0

fyi, этот вопрос не связан с PL/SQL или тегом 'plsqldeveloper'. Может быть, 'sql-tuning' будет более уместным. –

ответ

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).

+0

Я попробую, это имеет смысл. Я проведу тест. Спасибо за вашу помощь. – Christopher

+0

Это сработало, и я думаю, что это было успешным. Большое спасибо! – Christopher

+1

@ Кристофер: Если ответ сработал для вас, отметьте его как «Принятый ответ». Это придаст честь Гордону, но также покажет другим, что вы заботитесь о том, какую помощь вы получите. – cfi