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