oracle左连接优化,关于SQL左连接效率问题

项目在开发新功能,涉及到一张表,里面数据有一百多W的条,表字段竟然有一百多个。。实在是没法再往下新增加字段了,于是就新增了一张表,用做扩展吧,通过表key来关联。后来涉及到以扩展表中某个字段作为查询条件进行检索,于是很自然就会想到通过left join新建个视图,然后进行检索这个视图。可是很不幸...慢的要死,查一下要三十几秒...

SELECT *

FROM LANDREG.TDDJ_TDDJDA T

LEFT JOIN LANDREG.TDDJ_TDDJDA_EXT E

ON T.TDDJID = E.TDDJID

然后 explain plan一下语句,看到对两个表都进行了全表扫描。

9f7662eb4f5b3819830f5f475135c156.png

解释一下left join大概意思: 首先取出左边表中所有数据,然后再加上与左右两个表匹配的的数据。 这样一来速度自然就慢了

于是只能抛弃这种方法。

优化视图

先找出主表中扩展表没有的数据,然后再关联主表与扩展表,最后通过union all将两个查询结果联合起来形成一个视图。

SELECT T.TDDJID, '' AS FILEBARCODE

FROM TDDJ_TDDJDA T

WHERE NOT EXISTS

(SELECT 1 FROM LANDREG.TDDJ_TDDJDA_EXT E WHERE E.TDDJID = T.TDDJID)

UNION ALL

SELECT T.TDDJID, E.FILEBARCODE

FROM LANDREG.TDDJ_TDDJDA T, LANDREG.TDDJ_TDDJDA_EXT E

WHERE T.TDDJID = E.TDDJID

d01e8384a0c9b352a95fa36cac81ab2a.png

这样就避免了对主表进行了全表扫描。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值