今天遇到一个不可思议的问题,两种sql语句的写法造成了执行效率极大的不同
select s_id, f_id, r_id from COMP_parts where s_id||f_id in
( select se_id||f_id from COMPREC where code = 2314 ) group by s_id, f_id, r_id having count(*) > 1 查看这条语句的执行计划相当的高,执行速度也是相当的慢,几十万级别的数据,执行了20分钟没执行完
而另一种方法,只是将select s_id, f_id, r_id from COMP_parts where s_id||f_id in
( select se_id||f_id from COMPREC where code = 2314 ) 这部分先建立一个临时表。create table tmp as select s_id, f_id, r_id from COMP_parts where s_id||f_id in
( select se_id||f_id from COMPREC where code = 2314 )
然后 执行select s_id, f_id, r_id from tmp group by s_id, f_id, r_id having count(*) > 1 只需要2秒钟。而建立表也只需要2s。一共4秒。 和之前的二十分钟没有执行完的差距也太大了。
哪位高人能帮忙解答一下,多谢了。我最近在学习sql效率优化这块,希望大家帮忙啊。优化sql
select s_id, f_id, r_id from COMP_parts where s_id||f_id in
( select se_id||f_id from COMPREC where code = 2314 ) group by s_id, f_id, r_id having count(*) > 1 查看这条语句的执行计划相当的高,执行速度也是相当的慢,几十万级别的数据,执行了20分钟没执行完
而另一种方法,只是将select s_id, f_id, r_id from COMP_parts where s_id||f_id in
( select se_id||f_id from COMPREC where code = 2314 ) 这部分先建立一个临时表。create table tmp as select s_id, f_id, r_id from COMP_parts where s_id||f_id in
( select se_id||f_id from COMPREC where code = 2314 )
然后 执行select s_id, f_id, r_id from tmp group by s_id, f_id, r_id having count(*) > 1 只需要2秒钟。而建立表也只需要2s。一共4秒。 和之前的二十分钟没有执行完的差距也太大了。
哪位高人能帮忙解答一下,多谢了。我最近在学习sql效率优化这块,希望大家帮忙啊。优化sql
解决方案 »
- oracle 查询单列转单行
- 头疼的错误 ORA-00600 内部错误代码,参数:[kcbnew_3],[0],[43900],[]
- 如何在sql的from后面加条件
- 关于dblink.sql
- 如何优化带in条件批量查询?
- asp.net中报ORA-12560: TNS:protocol adapter error ,大家帮帮忙啊
- 请问在Oracle中如何设置像SQL Server中插入一行字段值会自动加1的字段,谢谢
- oracle的表建好后,怎么修改表名,以及在列id上增加索引
- 如何把oracle817中的数据导入到oracle816中?
- 各位在线的朋友,请帮个忙,我的数据库的没了,急死了!!!
- 求asp.net编程高手培训本人,培训费按天计算
- 批量更新
第二种方式就像楼上所说的,数据量少了,索引不索引也无所谓
第一种方式那个hash group by消耗极大
而第二种方式就没有这一步
from COMP_parts a
where exists(
select 1
from COMPREC b
where code = 2314
and a.s_id||f_id = b.se_id||f_id
)
group by s_id, f_id, r_id
having count(*) > 1;
10.2.0.1 效率很低 是全表扫描
10.2.0.4 应该优化了 很快
( select /*+ unnest*/se_id||f_id from COMPREC where code = 2314 ) group by s_id, f_id, r_id having count(*) > 1