【发布时间】: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 列。