我正在努力让我的查询尽快运行,但我很难在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
就会让它运行得非常慢
答案 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.column1
和table2
的索引,column2
上的索引或(column3, column2)
上的综合索引,我希望性能最佳{ p>
答案 1 :(得分:0)
我同意上面的Shannon,但你能在dev服务器上创建一个视图吗?
另外 select * 有点顽皮 - 最好命名你真正想要的字段。对于非常大的数据集,也可以提高性能。
答案 2 :(得分:0)
我错过了一些相信这会起作用的东西吗?
select t1.*
from table1 t1, table2 t2
where t1.column1 = t2.column2(+)
and t2.column3 > 0;