我有以下查询需要12小时才能执行,是否可以优化?表DRV_START_DATE
的{{1}}属于YYYYY
数据类型,因此将输入值转换为NUMBER
会有所帮助。
to_number
答案 0 :(得分:3)
您有一个分布式查询,数据来自远程站点。 Oracle工作的默认方式是从远程站点提取所有数据并在本地站点上对其进行过滤。
在您的情况下,这可能是一个糟糕的选择,具体取决于相关数据量。如果是这样,您可以使用DRIVING_SITE提示,它将评估远程站点上的连接并将结果返回到本地数据库。
我从来没有使用带有MERGE的DRIVING_SITE,但我认为这样的事情应该有效:
MERGE INTO XXXX D USING(
SELECT /*+parallel(a 10) DRIVING_SITE(YYYYY)*/
a.BATCH_NUMBER,COUNT(*) AS CALL_COUNT
FROM YYYYY@LN_RAPROD a
WHERE a.DRV_START_DATE BETWEEN TO_CHAR(SYSDATE-7,'YYYYMMDD')
AND TO_CHAR(SYSDATE,'YYYYMMDD')
AND a.TOTAL_TYPE =195
GROUP BY a.BATCH_NUMBER)
ON (D.BATCH_NUMBER=S.BATCH_NUMBER)
WHEN MATCHED THEN
UPDATE SET D.CALL_COUNT=S.CALL_COUNT
WHEN NOT MATCHED THEN
INSERT (D.BATCH_NUMBER,D.CALL_COUNT)
VALUES (S.BATCH_NUMBER,S.CALL_COUNT)
顺便说一句,您确定并行提示对您有帮助吗?