优化oracle查询

时间:2011-09-05 16:46:35

标签: oracle join linked-server

我正在努力让我的查询尽快运行,但我很难在5秒内完成。

我认为这是因为我引用了两个链接数据库

这是我的查询

select column2, column3, column4 
  from table1@dev 
 where column1 in (
          select distinct column2 
            from table2@dev 
           where column3 > 0
                  ) 
order by column1

有没有办法优化此查询?

我尝试过使用join,但似乎让查询运行得更长

提前致谢

修改

通过进一步调查,DRIVING_SITE可以让它像这样快速运行

select /*+ DRIVING_SITE(table1) */ t1.column2, t1.column3, t1.column4
from table1@dev t1, table2@dev t2
WHERE t2.column3 > 0

但是只要我添加distinct column2就会让它运行得非常慢

3 个答案:

答案 0 :(得分:1)

首先,不需要distinct。查询可以写成:

select * 
  from table1@dev 
 where column1 in (
          select column2 
            from table2@dev 
           where column3 > 0
                  ) 
order by column1

其次,有(至少)两种方式来编写它。使用JOIN

select t1.* 
  from table1@dev t1
  join table2@dev t2
 where t2.column2 = t1.column1
   and t2.column3 > 0 
group by
       t1.id, t1.column1, ... 

order by t1.column1

或(我的偏好)与EXISTS

select t1.* 
  from table1@dev t1 
 where exists
       ( select *
           from table2@dev 
          where t2.column2 = t1.column1
            and t2.column3 > 0
                  ) 
order by column1

在任何情况下,您都应该检查所有这些的执行计划。

如果您有table1.column1table2的索引,column2上的索引或(column3, column2)上的综合索引,我希望性能最佳

答案 1 :(得分:0)

我同意上面的Shannon,但你能在dev服务器上创建一个视图吗?

另外 select * 有点顽皮 - 最好命名你真正想要的字段。对于非常大的数据集,也可以提高性能。

答案 2 :(得分:0)

我错过了一些相信这会起作用的东西吗?

select t1.* 
from table1 t1, table2 t2 
where t1.column1 = t2.column2(+) 
and t2.column3 > 0;