2

Oracle 10g を実行しています。以下のクエリは、実行に約 25 分かかります。実行計画を確認したところ、コストの約 80% はDISTINCT COUNT.

SELECT STG.dts_start_dt_wid, 
   ML.sales_org_wid, 
   ML.cost_center_wid, 
   ML.chnl_type_wid, 
   ML.x_generic_lead_source_wid, 
   ML.x_specific_lead_source_wid, 
   ML.x_order_category_wid, 
   Count(DISTINCT ML.row_wid) AS TOTAL_ACTIVE_LICENSES 
FROM   wc_lsp_master_license_d ML, 
   wc_reflex_daily_activity_a_stg STG 
WHERE  ML.license_class = 'REFLEX' 
   AND STG.dts_start_dt_wid BETWEEN ML.extensions_start_dt_wid AND 
                                    ML.extensions_end_dt_wid 
   AND ML.license_name NOT LIKE '%demo@rosettastone.com' 
GROUP  BY STG.dts_start_dt_wid, 
      ML.sales_org_wid, 
      ML.cost_center_wid, 
      ML.chnl_type_wid, 
      ML.x_generic_lead_source_wid, 
      ML.x_specific_lead_source_wid, 
      ML.x_order_category_wid; 

残念ながら、個別の row_wids の数を取得する必要があります。そのため、最初のクエリをより高速に実行するためにできることがあるかどうかを把握しようとしています。

実行計画のスクリーンショットを次に示します。

ここに画像の説明を入力

これに関するヘルプやフィードバックは素晴らしいでしょう。

ありがとう!

4

2 に答える 2

0

グループごとの並べ替え操作のコストが高い場合は、並べ替えがディスクにあふれていることが原因である可能性があります。これは、問合せの実行中にV$SQL_WORKAREA_ACTIVEで確認できます。

MAX_MEM_USED、NUMBER_OF_PASSES、および TEMPSEG_SIZE に注意してください。

パスの数が 1 より大きい場合は、マルチパス ソートが発生しており、これは非常に遅い操作です。1 回のパスはそれほど悪くはありませんが、並べ替え操作中に使用される i/o の量を決定するため、クエリに必要な一時セグメントの大きさに注意してください。

この修正は次のいずれかです。

  1. インスタンス全体または特定のセッションのいずれかで、並べ替え用のメモリ割り当てを増やすか、または...
  2. 並べ替えるデータの量を減らします。これは主に、ソートのキー サイズを小さくすることを意味します。これは、group by に他の要素に依存する要素がある場合に実行できる場合があります。必要な要素のみでグループ化し、その結果セットに結合して他の依存要素を取得できます。
  3. 並列クエリを使用します。
于 2013-09-20T13:28:49.203 に答える
0

最初に、WHERE 句で (および COUNT DISTINCT から) 使用する列にインデックスがある (またはプライマリ/一意/外部キーである) ことを確認します。

次に、他の WHERE 句を追加して COUNT の DISTINCT を置き換えるか、非常に最適化された COUNT(*) に置き換えるかどうかを確認します。

第三に、カウント (個別) を別の結合またはサブクエリに移動して、パフォーマンスが変化するかどうかを確認することができます。

于 2013-09-12T15:04:57.233 に答える