0

こんにちは、このクエリ形成ロジックから誰か助けてくれませんか

SELECT C.CPPID, c.CPP_AMT_MANUAL  
FROM CPP_PRCNT CC,CPP_VIEW c 
WHERE 
  CC.CPPYR IN (
    SELECT C.YEAR FROM CPP_VIEW_VIEW C WHERE  UPPER(C.CPPNO) = UPPER('123')
    AND C.CPP_CODE       ='CPP000000000053'
    and TO_CHAR(c.CPP_DATE,'YYYY/Mon')='2012/Nov'
    )
  AND UPPER(C.CPPNO) = UPPER('123')
  AND C.CPP_CODE       ='CPP000000000053'
  and TO_CHAR(c.CPP_DATE,'YYYY/Mon') =  '2012/Nov';  

クエリのパフォーマンスと標準に関して、間違ったクエリ構造を作成した場合は修正してください。前もって感謝します

4

2 に答える 2

1

いくつかのインデックスまたはパーティション化されたテーブルがある場合、インデックス/選択パーティションを使用できるようにするために、列ではなく変数に対して関数を使用します。

また、ANSI 92 SQL 構文も使用しています。cpp_prcnt と cpp_view の間の結合条件を指定しない (または直接指定しない) ため、実際にはデカルト積 (交差結合) になります。

SELECT C.CPPID, c.CPP_AMT_MANUAL  
FROM CPP_PRCNT CC
CROSS JOIN CPP_VIEW c 
WHERE 
  CC.CPPYR IN (
    SELECT C.YEAR 
    FROM CPP_VIEW_VIEW C 
    WHERE  C.CPPNO = '123'
      AND C.CPP_CODE       ='CPP000000000053'
      AND trunc(c.CPP_DATE,'MM')=to_date('2012/Nov','YYYY/Mon')
    )
    AND  C.CPPNO = '123'
    AND C.CPP_CODE       ='CPP000000000053'
    AND trunc(c.CPP_DATE,'MM')=to_date('2012/Nov','YYYY/Mon')

cpp_view_view の定義 (cpp_view に対するビューのようです)、CPP_VIEW の定義 (単純な場合)、および達成しようとしていることを示していただければ、改善/修正すべきことがもっとあると思います。

于 2013-01-08T08:08:33.997 に答える
0

改善できる点がいくつかあります。

  • 可能であれば、比較で UPPER() を取り除きます。これにより、インデックスが役に立たなくなります。それが不可能な場合は、UPPER(CPPNO) の関数ベースのインデックスを検討してください。
  • DATE 列を文字列に変換して文字列と比較しないでください - 逆の方法で行います (つまり、文字列を日付に変換します => テーブル行ごとに 1 回ではなく 1 回の変換のみが必要で、インデックスの使用が可能です)
  • Dileepが示唆するように、INの代わりにEXISTSで遊んでください - より速いかもしれません
于 2013-01-08T08:11:11.693 に答える