我正在努力应对数据密集化以用于报告目的。我创建了两个维度表(时间和技能)和一个数据表(调用)。现在因为在一定时间内数据表中没有调用,所以我不会得到包含所有日期的时间序列。我现在已经在互联网上研究了许多样本如何处理数据密集化,并提出了下面的解决方案。
查询按预期工作,只需要很长时间,我觉得效率很低。能否请您建议如何加快查询执行时间?
谢谢你,最诚挚的问候, 亚历
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
答案 0 :(得分:0)
查看执行计划并检查哪些步骤需要很长时间。使用EXPLAIN PLAN
获取它。查找全表扫描,查看索引是否有帮助。确保您有关于表格的最新统计数据
由于您正在讨论维度表,因此假定此代码来自数据仓库数据库。如果是,你使用分区吗?并行DML?你在使用EE吗?
答案 1 :(得分:0)
我将PARTITION BY ()
中的参数缩减为单个主键(temp_values.SKILL_NAME),并在上述查询结尾处使用LEFT OUTER JOIN
加入技能维度中缺少的信息。通过这种方式,不再产生相同的重复,这使我减少了SELECT DISTINCT to SELECT
。
此外,我添加了外国和主键,让查询以并行模式运行。
这有助于我将执行时间减少80%以上,这已足够。谢谢你们!