这个SQL(Oracle)如何优化

wdwnet 发布于 2017/03/21 14:53
阅读 263
收藏 0

目前执行一次88秒

加载中
1
MnameHZJ
MnameHZJ
我不知道你的业务场景是什么,但是看你这sql,可以不用full join 。 select count(1) from CK T2 left join TEM_C1 T1 on T1.BAR_CODE = T2.dnb_ccbh where … where 后面和你的一样。你where后面用了个T2.TQID IS NOT NULL 就和你的full join自相矛盾了,所以可以用left join 代替。
MnameHZJ
MnameHZJ
回复 @wdwnet : 我这样改写了一下,不知道能不能解决问题,你可以试试: select count(1) from CK T2 where T2.TQID is not null and not exists (select 1 from TMP_C1 T1 where T1.ASSET_NO = T2.asset_no and T1.TG_NO = T2.TQID)
wdwnet
wdwnet
没错,但leftjion也40多秒
MnameHZJ
MnameHZJ
T2放到前面,然后left join
0
王涛
王涛

非得full join么

还有那俩code能加索引么

wdwnet
wdwnet
都加索引了,不用fulljoin用什么
wdwnet
wdwnet
都加索引了,不用fulljoin用什么
0
moliunian
moliunian

不能用小于 大于吧,这样索引是没起作用的

moliunian
moliunian
回复 @wdwnet : 记错了,不一定要等于 http://blog.csdn.net/kongbaidepao/article/details/51920796
moliunian
moliunian
回复 @wdwnet : 我记得是有等于才能走索引呀
wdwnet
wdwnet
没听说过<>索引不生效
0
lgscofield
lgscofield
where后面和两张表都有关的条件放倒on后面试试
0
prey
prey

select count(1) from
(select asset_no,tg_no,bar_code from tmp_c1) t1
join
(select asset_no,tqid,dnb_ccbh from ck where tqid is not null) t2
on t1.bar_code=t2.dnb_ccbh
where (t1.asset_no <> t2.asset_no or t1.tg_no <> t2.tqid) ;

走不走索引 要看优化器的判断 如果认为走全表扫描比走索引更好 那就全表  通常和命中的数据集占比有关,也可以  select /*+ index(table,index_name)*/ field1,field2 from xxx ; 强制使用索引

wdwnet
wdwnet
回复 @prey : 合成1个表就正常了,零点几秒
prey
prey
回复 @wdwnet : 最终结果是多少呢
wdwnet
wdwnet
运行了一下,50多秒
0
wdwnet
wdwnet

谢谢大家了,2张表试了很多种方案,都很慢,现在已经把2张表合并成1张了,这样就正常了

返回顶部
顶部