2016-10-08 5 views
1

データの場合は何千ものデータを含むselectステートメントがありますが、実行時間は非常に遅く、15分以上かかる場合があります。私はこのselect文の実行時間を改善することができます。非常に遅いoracle選択ステートメント

select a.levelP, 
     a.code, 
     a.descP, 
     (select nvl(SUM(amount),0) from ca_glopen where code = a.code and acc_mth = '2016') ocf, 
     (select nvl(SUM(amount),0) from ca_glmaintrx where code = a.code and to_char(doc_date,'yyyy') = '2016' and to_char(doc_date,'yyyymm') < '201601') bcf, 
     (select nvl(SUM(amount),0) from ca_glmaintrx where jum_amaun > 0 and code = a.code and to_char(doc_date,'yyyymm') = '201601') debit, 
     (select nvl(SUM(amount),0) from ca_glmaintrx where jum_amaun < 0 and code = a.code and to_char(doc_date,'yyyymm') = '201601') credit 
from ca_chartAcc a 
where a.code is not null 
order by to_number(a.code), to_number(levelP) 

アップあなたの主な問題は、あなたのサブクエリのほとんどはあなたの日付にいくつかの厄介なものも含めて検索条件、上の機能を使用することで、私のクエリとresult.TQ

+1

はい:サブクエリは結果行ごとに実行されている可能性があります。ええ、最初のものを除くすべてがインデックス(テーブルスキャン)を使用する可能性は低いです。それと、あなたの 'ORDER BY 'はすべての行を変換する必要があるので、インデックスを使うこともできません。 –

+0

クエリヒントを使用して適切なインデックスを作成しようとしました –

+0

これを変更しようとします –

答えて

0

を高速化する方法のために私を助けてください。実際の日付を指定することで、予想範囲を明示的に修飾することができます(1か月の範囲は通常、合計行のうち小さい割合であるため、インデックスに当てはまる可能性が非常に高い)。

SELECT Chart.levelP, Chart.code, Chart.descP, 
     COALESCE(GL_SUM.ocf, 0), 
     COALESCE(Transactions.bcf, 0), 
     COALESCE(Transactions.debit, 0), 
     COALESCE(Transactions.credit, 0), 
FROM ca_ChartAcc Chart 
LEFT JOIN (SELECT code, SUM(amount) AS ocf 
      FROM ca_GLOpen 
      WHERE acc_mth = '2016') GL_Sum 
     ON GL_Sum.code = Chart.code 
LEFT JOIN (SELECT code, 
        SUM(amount) AS bcf, 
        SUM(CASE WHEN amount > 0 THEN amount) AS debit, 
        SUM(CASE WHEN amount < 0 THEN amount) AS credit, 
      FROM ca_GLMainTrx 
      WHERE doc_date >= TO_DATE('2016-01-01') 
       AND doc_date < TO_DATE('2016-02-01')) Transactions 
     ON Transactions.code = Chart.code 
WHERE Chart.code IS NOT NULL 
ORDER BY TO_NUMBER(Chart.code), TO_NUMBER(Chart.levelP) 

あなたはわずか数のコードが必要な場合、それは(オプティマイザがあなたのためにこれを実行する可能性があることに注意してくださいが)だけでなく、サブクエリの中にそれらの値をプッシュするために、より良い結果をもたらす可能性があります。
句からTO_NUMBER(...)へのコールを削除することは可能です。しかし、これは値のフォーマットに依存します。なぜなら、それらがどのようにコード化されたかによって結果の順序が変わる可能性があるからです。

+0

あなたの答えは正しいものです –