【发布时间】:2019-02-06 09:55:23
【问题描述】:
我有一个查询,我正在尝试优化一个运行需要 6 分钟的查询(DS1 有 200k 行,DS2 也有 200k 行)。我想知道甲骨文大师是否可以看到任何优化? 我绝不是专家,更像是一个业余爱好者......问题看起来像分组部分花费的时间最长......
WITH DS1 AS
(SELECT
/*+ PARALLEL */
*
FROM PD1
WHERE TYPE = 'TSY'
AND SOURCE = 'A'
),
DS2 AS
(SELECT
/*+ PARALLEL */
*
FROM PD1
WHERE TYPE = 'LGL'
AND SOURCE = 'B'
),
Q AS
(SELECT DS1.ID AS DS1_ID,
DS1.CODE AS DS1_CODE,
DS2.CODE AS DS2_CODE,
DS2.ID AS DS2_ID,
DS1.TYPE AS TYPE1,
DS2.TYPE AS TYPE2,
DS1.SOURCE AS SS1,
DS2.SOURCE AS SS2,
DS1.ATTRIBUTE,
DS1.ATTRIBUTE_VAL,
DS1.ATT_AND_VAL
FROM DS1
JOIN DS2
ON DS1.ATT_AND_VAL = DS2.ATT_AND_VAL
) ,
GROUPINGS AS
(SELECT
/*+no_merge */
DS1_ID AS BASE_ID ,
DS1_CODE AS BASE_CODE,
DS2_CODE AS TARGET_CODE,
COUNT(DISTINCT(DS2_ID)) AS COUNT_OF_TARGET_ID
FROM Q
GROUP BY DS1_ID,
DS1_CODE,
DS2_CODE
)
SELECT *
FROM GROUPINGS
ORDER BY BASE_ID,
BASE_CODE,
TARGET_CODE;
【问题讨论】:
-
首先要做的是检查解释计划。请获取解释计划输出(作为文本,而不是图像)并将其包含在您的问题中。
-
另外,PD1 表的主键/唯一键是什么?
标签: sql oracle performance query-optimization