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 加入的主要内容,如果未能解决你的问题,请参考以下文章

Oracle dblink

有条件地加入 - COALESCE 与 OR - Oracle SQL

Oracle DBLink跨数据库访问SQL server数据同步 踩坑实录

dblink 上的 Oracle sql 类型

通过oracle dblink,怎么执行远程数据库的存储过程。或者说可以执行吗?怎么弄?

经典案例:如何优化Oracle使用DBlink的SQL语句