Sql 带有IN(DB链接)和本地约束的WHERE子句:慢速查询

Sql 带有IN(DB链接)和本地约束的WHERE子句:慢速查询,sql,performance,oracle11g,Sql,Performance,Oracle11g,我不明白为什么这个查询非常慢(+5分钟): CREATIE\u DT上没有索引 在以下所有情况下,查询执行速度都非常快(约10毫秒): 注意最后一个例子(!)中的=。 有人有什么想法吗 我尝试了/*+DRIVING\u站点(a)*/提示,但没有效果 如果有人知道我在本例中可以使用的提示,强制执行引擎缓存远程查询的结果,请告知,我将接受您的回答。只是想一想,这是如何执行的 SELECT a.* FROM local a WHERE a.CREATIE_DT > to_date('17/06/

我不明白为什么这个查询非常慢(+5分钟):

CREATIE\u DT
上没有索引

在以下所有情况下,查询执行速度都非常快(约10毫秒):

注意最后一个例子(!)中的
=
。 有人有什么想法吗

我尝试了
/*+DRIVING\u站点(a)*/
提示,但没有效果


如果有人知道我在本例中可以使用的提示,强制执行引擎缓存远程查询的结果,请告知,我将接受您的回答。只是想一想,这是如何执行的

SELECT a.*
FROM local a
WHERE a.CREATIE_DT > to_date('17/06/2014 10:30:56','dd/mm/yyyy hh24:mi:ss')
UNION
SELECT a.*
FROM local a
WHERE (a.ID) IN ( SELECT r.ID FROM remote@testsite r);

也许有一个关于创造力的索引是个好主意。只是一个想法,它是如何执行的

SELECT a.*
FROM local a
WHERE a.CREATIE_DT > to_date('17/06/2014 10:30:56','dd/mm/yyyy hh24:mi:ss')
UNION
SELECT a.*
FROM local a
WHERE (a.ID) IN ( SELECT r.ID FROM remote@testsite r);

建立一个关于创造力的索引可能是个好主意,因为你似乎自己已经回答了这个问题

中带有
的版本会导致Oracle优化器为每行重新运行子查询多次。带有
=
的版本经过优化,因此Oracle只需调用远程服务器并缓存结果

您可能可以通过将查询作为一个
连接来解决此问题:

SELECT a.*
FROM local a JOIN
      (SELECT DISTINCT r.ID FROM remote@testsite r
      ) r
     ON a.ID = r.ID
WHERE a.CREATIE_DT > to_date('17/06/2014 10:30:56','dd/mm/yyyy hh24:mi:ss');
注意在
SELECT
中使用
DISTINCT
,以防止行重复。如果您知道
r.id
是唯一的,则可能不需要这样做

编辑:

要获取原始查询的等效项(其中存在
而不是
),请执行以下操作:


你似乎已经自己回答了

中带有
的版本会导致Oracle优化器为每行重新运行子查询多次。带有
=
的版本经过优化,因此Oracle只需调用远程服务器并缓存结果

您可能可以通过将查询作为一个
连接来解决此问题:

SELECT a.*
FROM local a JOIN
      (SELECT DISTINCT r.ID FROM remote@testsite r
      ) r
     ON a.ID = r.ID
WHERE a.CREATIE_DT > to_date('17/06/2014 10:30:56','dd/mm/yyyy hh24:mi:ss');
注意在
SELECT
中使用
DISTINCT
,以防止行重复。如果您知道
r.id
是唯一的,则可能不需要这样做

编辑:

要获取原始查询的等效项(其中存在
而不是
),请执行以下操作:


是的,但是为什么exec引擎在第一种情况下不使用索引?@davor。优化远程访问的主题相当长。开始的地方是文档:。但是,简单的回答是,由于数据不在同一台服务器上,引擎必须将数据传送过来。这会减少用于优化查询的选项。@GordonLinoff好的,谢谢。正如您所指出的,我假设远程查询将被缓存。此外,您的解决方案速度很快,但与问题中的查询不相等。问题使用了OR关系。@davor。我为
添加了等效查询。是的,但是为什么exec引擎在第一种情况下不使用索引?@davor。优化远程访问的主题相当长。开始的地方是文档:。但是,简单的回答是,由于数据不在同一台服务器上,引擎必须将数据传送过来。这会减少用于优化查询的选项。@GordonLinoff好的,谢谢。正如您所指出的,我假设远程查询将被缓存。此外,您的解决方案速度很快,但与问题中的查询不相等。问题使用了OR关系。@davor。我为
添加了等效的查询。Fast!!但我更喜欢上面Gordon Linoff使用索引的解决方案。无论如何谢谢你!快速的但我更喜欢上面Gordon Linoff使用索引的解决方案。无论如何谢谢你!
SELECT a.*
FROM local a LEFT JOIN
      (SELECT DISTINCT r.ID FROM remote@testsite r
      ) r
     ON a.ID = r.ID
WHERE a.CREATIE_DT > to_date('17/06/2014 10:30:56','dd/mm/yyyy hh24:mi:ss') or
      r.ID is not null;