Performance 数据加密Oracle查询效率低且速度慢

Performance 数据加密Oracle查询效率低且速度慢,performance,oracle,sparse-matrix,Performance,Oracle,Sparse Matrix,我正试图处理用于报告目的的数据加密。我创建了两个维度表(时间和技能)和一个数据表(调用)。现在,由于在特定的时间内,数据表中没有调用,所以我不会得到包含所有日期的时间序列。我现在已经研究了互联网上的许多样本如何应对数据加密,并提出了以下解决方案 查询按预期工作,只是需要很长时间,我觉得它效率很低。您能告诉我如何加快查询执行时间吗 谢谢你,并致以最良好的祝愿, 亚历克斯 查看执行计划并检查哪些步骤需要很长时间。使用解释计划获取计划。查找完整的表扫描,看看索引是否有帮助。确保表格上有最新的统计信息。

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

查询按预期工作,只是需要很长时间,我觉得它效率很低。您能告诉我如何加快查询执行时间吗

谢谢你,并致以最良好的祝愿, 亚历克斯


查看执行计划并检查哪些步骤需要很长时间。使用
解释计划
获取计划。查找完整的表扫描,看看索引是否有帮助。确保表格上有最新的统计信息。

由于您讨论的是维度表,因此假定此代码来自数据仓库数据库。如果是,您是否使用分区?并行DML?您在使用EE吗?

在上述查询结束时,我将
PARTITION BY()
中的参数减少为单个主键(temp\u values.SKILL\u NAME),并使用
左外部联接将SKILL维度中缺少的信息联接起来。这样就不会产生更多相同的重复,这会导致我减少
选择DISTINCT以选择

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


它帮助我将执行时间减少了80%以上,这就足够了。谢谢大家

那么基数和索引呢?当你在做的时候,解释计划的输出呢?不幸的是,我没有访问解释计划的权限,我也不会得到它。不要问我为什么:我现在正在尝试多少索引会有帮助。你应该考虑在你的查询中使用表别名。显然,它不会影响性能,但会提高可读性并简化代码维护。不要问我为什么:)并行DML已经将查询执行时间减少了20%。谢谢你的提示。我现在正在尝试索引将有多大帮助。我有一种直觉,在许多参数上按()划分会生成不必要的数据。出于这个原因,我不得不使用SELECT DISTINCT来忽略多个相等的条目。是否有其他可能将分区中的参数大小减少?据我所知,您不需要“访问”到
EXPLAIN PLAN
;它应该是可用的。您可能需要创建自己的输出表(
PLAN\u table
),但这似乎不太可能,因为默认的输出表(
PLAN\u table$
)可以通过
PUBLIC
SELECT
INSERT
UPDATE
DELETE
)和
同义词访问。尝试一些简单的方法,比如从DUAL中选择1的EXPLAIN PLAN SET语句\u ID='test'
然后查询
计划表
。如果您确实没有
解释计划
所需的访问权限或任何特权,则需要它。您是开发人员,这是您的职位所必需的。实际上,demand
可以选择任何字典。(我假设您没有使用生产系统…)谢谢Szilard,我现在要求提供Permition SELECT ANY DICTIONARY。你说得对,它不是一个生产系统,而是一个数据集市。一旦获得许可,我会带着执行计划回来。Rgds
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