我有1个本地表(除一个以外的所有列名都与远程表不同)和2个需要合并数据的远程表(它们具有相同的列名)。
以下是我使用LEFT OUTER JOIN和UNION编写的查询,但是性能很慢。
任何人都可以帮助优化此查询吗?
select
"CONTROL_M_SERVER",
"HOST",
CASE
WHEN "AGSTAT" = 'V' THEN 'Available'
WHEN "AGSTAT" = 'U' THEN 'Unavailable'
WHEN "AGSTAT" = 'R' THEN 'Discovering'
ELSE 'Not Defined in Control-M'
END as Agent_Status,
T1.VERSION,
"PORTS",
"MANAGEMENT_IP",
"OPERATING_SYSTEM",
"CLUSTER_ALIAS",
"NODEGROUP",
"APPLICATION_ID",
"DATE_CONFIGURED",
"CONFIGURED_BY"
from "CTMAGENTAUDIT" T1
left outer join (select NODEID,AGSTAT from CMR_NODES@SPDB UNION ALL select NODEID,AGSTAT from CMR_NODES@DEVDB) T2 on T2.NODEID = T1.HOST;
我在查询中看到的主要问题是与CTMAGENTAUDIT
包含联合的子查询之间最外面的联接。该子查询的问题在于,按照书面规定,Oracle可能无法对联接使用任何索引。这意味着Oracle在加入时可能不得不求助于较慢的方法,可能会进行全面扫描。
这里的一种方法是创建一个包含联合查询的实例化视图,然后对其进行索引:
CREATE MATERIALIZED VIEW T2 AS
SELECT NODEID, AGSTAT FROM CMR_NODES@SPDB
UNION ALL
SELECT NODEID, AGSTAT FROM CMR_NODES@DEVDB;
CREATE INDEX mv_node_idx ON T2 (NODEID);
有了这个建立索引的物化视图,我希望您的查询现在执行得更好:
SELECT
CONTROL_M_SERVER,
HOST,
CASE WHEN AGSTAT = 'V' THEN 'Available'
WHEN AGSTAT = 'U' THEN 'Unavailable'
WHEN AGSTAT = 'R' THEN 'Discovering'
ELSE 'Not Defined in Control-M' END AS Agent_Status,
T1.VERSION,
PORTS,
MANAGEMENT_IP,
OPERATING_SYSTEM,
CLUSTER_ALIAS,
NODEGROUP,
APPLICATION_ID,
DATE_CONFIGURED,
CONFIGURED_BY
FROM CTMAGENTAUDIT T1
LEFT OUTER JOIN T2
ON T2.NODEID = T1.HOST;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句