Oracle SQL:通过 dblink 加入
Posted
技术标签:
【中文标题】Oracle SQL:通过 dblink 加入【英文标题】:Oracle SQL: JOIN by dblink 【发布时间】:2015-04-27 15:04:06 【问题描述】:我在 Oracle DB 中使用下一个 SQL 查询:
SELECT T1.*,
T3.*
FROM MyTable1 T1
INNER JOIN MyTable2 T2 ON T2.Id1 = T1.Id
LEFT JOIN MyTable3@dblink1 T3 ON T3.Id2 = T2.Id
这个查询非常简单和快速(大约 1 分钟,T1 包含大约 100 万行,T3 超过 1000 万行)。现在我想使用 dblink1 中的 MyTable4 来过滤选定的行数据。为此,我使用子查询:
SELECT T1.*,
T3.*
FROM MyTable1 T1
INNER JOIN MyTable2 T2 ON T2.Id1 = T1.Id
LEFT JOIN (SELECT Sub_T1.*
FROM MyTable3@dblink1 Sub_T1
INNER JOIN MyTable4@dblink1 Sub_T2 ON Sub_T2.Id3 = Sub_T1.Id
WHERE
Sub_T2.MyColumn1 = 'required value') T3 ON T3.Id2 = T2.Id
但是这个查询太慢了(超过 20 分钟)。如果我将此查询重写为:
SELECT T1.*,
T3.*
FROM MyTable1 T1
INNER JOIN MyTable2 T2 ON T2.Id1 = T1.Id
LEFT JOIN MyTable3@dblink1 T3 ON T3.Id2 = T2.Id
LEFT JOIN MyTable4@dblink1 T4 ON T4.Id3 = T3.Id
WHERE
T4.MyColumn1 = 'required value'
然后我的查询再次快速运行,但我不喜欢结果(如果 WHERE 返回 false,我希望将 T3 的列视为 null)。 如何改进我的第二个查询以加快速度?
【问题讨论】:
您真正计划在 T3 的结果集中使用多少列?也许您要链接到的数据库中的视图(由 MyTable3 连接到 MyTable4 组成的视图)或函数值得尝试(基数看起来不正确)。 我打算只使用 T3 中的 2 列。 【参考方案1】:用括号来表述查询是否可以解决问题?
SELECT T1.*,
T3.*
FROM MyTable1 T1 INNER JOIN
MyTable2 T2
ON T2.Id1 = T1.Id LEFT JOIN
(MyTable3@dblink1 T3 JOIN
MyTable4@dblink1 T4
ON T4.Id3 = T3.Id AND
T4.MyColumn1 = 'required value'
)
ON T3.Id2 = T2.Id;
或者,也:
SELECT T1.*,
T3.*
FROM MyTable1 T1 INNER JOIN
MyTable2 T2
ON T2.Id1 = T1.Id LEFT JOIN
MyTable3@dblink1 T3
ON T3.Id2 = T2.Id
EXISTS (SELECT 1 FROM MyTable4@dblink1 T4 WHERE T4.Id3 = T3.Id AND T4.MyColumn1 = 'required value'
)
【讨论】:
不,这是不正确的。我使用 MyTable4 仅用于过滤 MyTable3 并且您的查询返回结果而不过滤。以上是关于Oracle SQL:通过 dblink 加入的主要内容,如果未能解决你的问题,请参考以下文章
有条件地加入 - COALESCE 与 OR - Oracle SQL
Oracle DBLink跨数据库访问SQL server数据同步 踩坑实录