0

~53 のコード文字列のクエリがあり、最適化する必要があります。PL/SQL Developer 7.0 ツールを持っていますが、最適化のためにどのように使用すればよいですか?

Explain Plan を使用しようとしましたが、何も教えてくれません。時間とタイムスタンプの列も追加しましたが、興味深いものは何もありません。最初は空で、2 番目は常に同じ時間です。

テスト ウィンドウを使用しようとしましたが、変数の挿入が必要な手順があり、クエリで多くの行を選択すると使用できません。

質問は、PL/SQL Developer を使用して SQL クエリを最適化するにはどうすればよいですか? 各サブクエリのクエリ実行時間を取得するには、どこを探す必要がありますか? いくつかのガイドがあるかもしれませんが、今のところドキュメントしか見つかりませんでしたが、役に立ちませんでしたか? 私の現在の知識では、このような大きなクエリをツールなしで最適化することは不可能に見えます。

最適化が必要なクエリ:

select count(PRODUCT_NUMBER)
  from 
(select W.SUID,
       I.SUID,
       W.PRODUCT_NUMBER,
       MI.ML_NUMBER,
       I.TITLE_TRANSLIT,
       I.COUNTRIES,
       QTY.REMAINS,
       QTY.ACQ_PRICE_USD,
       QTY.REMAINS * QTY.ACQ_PRICE_USD as TOTAL
  from (select UID_WARE,
               QTY as REMAINS,
               ACQ_PRICE_USD
          from (select UID_WARE,
                       PRODUCT_NUMBER,
                       NVL(sum(QTY_ON_STOCK), 0) - NVL(sum(ADD_IN_QTY), 0) + NVL(sum(ADD_OUT_QTY), 0) as QTY,
                       ACQ_PRICE_USD as ACQ_PRICE_USD
                  from (select SI.UID_WARE,
                               W.PRODUCT_NUMBER,
                               count(distinct STK.SUID) as QTY_ON_STOCK,
                               sum(case
                                     when 1 = 1  then
                                      DECODE('' , SM.UID_SOURCE_LOCATION, SM.QTY, 0)
                                     else 0
                                   end) as ADD_OUT_QTY,
                               sum(case
                                     when 1 = 1  then
                                      DECODE('' , SM.UID_DEST_LOCATION, SM.QTY, 0)
                                     else 0
                                   end) as ADD_IN_QTY,
                               ROUND(ACQ.PRICE_USD, 2) as ACQ_PRICE_USD
                          from STOCK_MOVEMENTS SM
                          join STOCK_ITEMS SI on SM.UID_STOCK_ITEM = SI.SUID
                          left outer join (select PR.UID_STOCK_ITEM,
                                                 DECODE(NVL(CR.RATE, 0), 0, 0, PR.PRICE / CR.RATE) as PRICE_USD
                                            from MV_STOCK_ACQ_PRICES PR,
                                                 CURRENCY_RATES CR
                                           where PR.PRICE_DATE = CR.RATE_DATE
                                                 and PR.UID_CURRENCY = CR.UID_CURRENCY) ACQ on ACQ.UID_STOCK_ITEM = SI.SUID
                          join WARES W on W.SUID = SI.UID_WARE
                          left outer join (select distinct STK.SUID,
                                                           STK.QTY_REMAINS
                                             from STOCK_ITEMS STK
                                            where STK.UID_STOCK_LOCATION != 'MS-STL-SALED' 
                                                  ) STK on STK.SUID = SI.SUID
                         where 1 = 1

                         group by SI.UID_WARE,
                                  W.PRODUCT_NUMBER,
                                  ACQ.PRICE_USD
                        ) T
                 group by T.UID_WARE,
                          T.PRODUCT_NUMBER,
                          ACQ_PRICE_USD)) QTY
  join WARES W on W.SUID = QTY.UID_WARE
  join INVENTORY I on I.SUID = W.UID_ISSUE
  join MAP_INFO MI on MI.SUID = I.SUID
 where REMAINS != 0
       and w.UID_SECTION in ('MS-SEC-BOOKS', 'MS-SEC-MAPS'))
4

2 に答える 2

1

GUI を使用してクエリを分析および最適化すると、支援を受ける可能性のあるはるかに小さなコミュニティに身を置くことになります。Explain Plan を実行し、DBMS_XPlan.Display を使用して書式設定された結果を取得する場合、何万人もの実務家が理解する標準的な方法で作業していることになります。

また、count(*) だけで外側のクエリにクエリをラップしたのではないかと思います。これは、すべての行を返す手間をかけずにクエリを実行するためかもしれませんが、まったく異なる実行計画を取得する可能性があります。通常の計画の使用を促進するのに役立つヒントはありますが、それが実行されるという保証はありません。変わりません。したがって、これがチューニングの都合である場合は、取り除いてください。

だから私のアドバイス:

  1. 通常のクエリベースの方法で説明計画を実行し、「役立つ」ツールに依存しないでください。
  2. 調整が必要な実際のクエリを実行します。
  3. 実行計画を投稿します。
于 2012-12-19T10:50:47.507 に答える
0

実行時間については、ここから:

SQL> set timing on;

PL/SQL Developer では、各サブクエリを個別に実行できます。マウスでマークして を押しF8ます。SQL ウィンドウの左下隅 (結果の下) に実行時間が表示されます。

最適化は簡単な作業ではありません。自分で考える必要があります。私の知る限り、これを行うためのツールはありません。あなたのアプローチは、多くの要因に依存する可能性があります-dbバージョン、基礎となるOS、テーブルサイズ、インデックス作成...

いくつかのガイドを読むことができます ( thisthisまたはthisなど)

アップデート

データベースのバージョンに応じて、CTEまたはSQL モデリングを試すことができます。パフォーマンスは確実に向上しますが、学習には時間がかかります。

の代わりに、分析関数group byを試すことができます(たとえば、例についてはこのリンクを参照してください)。partition by

于 2012-12-19T10:06:27.973 に答える