数据加密Oracle查询效率不高且速度慢

时间:2012-05-16 00:47:45

标签: performance oracle sparse-matrix

我正在努力应对数据密集化以用于报告目的。我创建了两个维度表(时间和技能)和一个数据表(调用)。现在因为在一定时间内数据表中没有调用,所以我不会得到包含所有日期的时间序列。我现在已经在互联网上研究了许多样本如何处理数据密集化,并提出了下面的解决方案。

查询按预期工作,只需要很长时间,我觉得效率很低。能否请您建议如何加快查询执行时间?

谢谢你,最诚挚的问候, 亚历

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

2 个答案:

答案 0 :(得分:0)

查看执行计划并检查哪些步骤需要很长时间。使用EXPLAIN PLAN获取它。查找全表扫描,查看索引是否有帮助。确保您有关于表格的最新统计数据 由于您正在讨论维度表,因此假定此代码来自数据仓库数据库。如果是,你使用分区吗?并行DML?你在使用EE吗?

答案 1 :(得分:0)

我将PARTITION BY ()中的参数缩减为单个主键(temp_values.SKILL_NAME),并在上述查询结尾处使用LEFT OUTER JOIN加入技能维度中缺少的信息。通过这种方式,不再产生相同的重复,这使我减少了SELECT DISTINCT to SELECT

此外,我添加了外国和主键,让查询以并行模式运行。

这有助于我将执行时间减少80%以上,这已足够。谢谢你们!