我在Oracle DB中使用next SQL-query:
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'然后我的查询再次快速工作,但是我不喜欢result (我希望看到T3的列为null,如果WHERE返回false)。如何改进我的第二个查询,以提高速度呢?
发布于 2015-04-27 23:07:59
用括号表示查询能解决这个问题吗?
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'
)https://stackoverflow.com/questions/29899316
复制相似问题