0

レポート目的でデータの高密度化に対処しようとしています。2 つのディメンション テーブル (時間とスキル) と 1 つのデータ テーブル (通話) を作成しました。特定の時間帯にデータ テーブルに呼び出しがないため、すべての日を含む時系列を取得できません。私は現在、データの高密度化に対処する方法についてインターネットで多くのサンプルを研究しており、以下の解決策を見つけました。

クエリは意図したとおりに機能しますが、かなり時間がかかり、非常に非効率的だと感じています。クエリの実行時間を短縮する方法を教えてください。

よろしくお願いします、アレックス

SELECT DISTINCT
  DAY_ID,
  DAY_SHORT,
  WEEK_ID,
  MONTH_ID,
  QUARTER_ID,
  YEAR_ID,
  AREA,
  FIRMA,
  PRODUCT,
  PRODUCT_FAMILY,
  PRODUCT_WFM,
  LANGUAGE,
  NVL(NCO,0) NCO,
  NVL(NCH,0) NCH,
  NVL(NCH60,0) NCH60,
  NVL(LOST,0) LOST
FROM (
  SELECT
    DS.AREA,
    DS.FIRMA,
    DS.PRODUCT,
    DS.PRODUCT_FAMILY,
    DS.PRODUCT_WFM,
    DS.LANGUAGE,
    SUM(NVL(CH.HANDLED,0)+NVL(CH.LOST,0)) AS NCO,
    SUM(CH.HANDLED) AS NCH,
    SUM(CH.HANDLED_IN_SL) AS NCH60,
    SUM(CH.LOST) AS LOST,
    CH.DELIVER_DATE,
    CH.SKILL_NAME
  FROM
    WFM.WFM_TBL_DIMENSION_SKILL DS
  LEFT JOIN
    OPS.VW_CALL_HISTORY CH
  ON
    DS.SPLIT_NAME=CH.SKILL_NAME
  GROUP BY
    DS.AREA,
    DS.FIRMA,
    DS.PRODUCT,
    DS.PRODUCT_FAMILY,
    DS.PRODUCT_WFM,
    DS.LANGUAGE,
    CH.DELIVER_DATE,
    CH.SKILL_NAME
) temp_values
PARTITION BY
(
  temp_values.AREA,
  temp_values.FIRMA,
  temp_values.PRODUCT,
  temp_values.PRODUCT_FAMILY,
  temp_values.PRODUCT_WFM,
  temp_values.LANGUAGE,
  temp_values.DELIVER_DATE,
  temp_values.SKILL_NAME
)
RIGHT OUTER JOIN (
  SELECT
    DAY_ID,
    DAY_SHORT,
    WEEK_ID,
    MONTH_ID,
    QUARTER_ID,
    YEAR_ID
  FROM
    WFM.WFM_TBL_DIMENSION_TIME
  WHERE
    DAY_ID BETWEEN(SELECT MIN(DELIVER_DATE) FROM OPS.VW_CALL_HISTORY) and TRUNC(sysdate-1)
) temp_time
ON
  temp_values.DELIVER_DATE=temp_time.DAY_ID
4

2 に答える 2

0

実行計画を見て、どのステップが非常に長くかかるかを確認してください。使用EXPLAIN PLANして取得します。テーブル全体のスキャンを探し、インデックスが役立つかどうかを確認します。テーブルに最新の統計があることを確認してください。
ディメンション テーブルについて話しているため、このコードはデータ ウェアハウジング データベースからのものであると想定されます。使用している場合、パーティションを使用しますか? パラレルDML? Eを使っていますか?

于 2012-05-16T02:26:33.057 に答える