sql join 子查询_SQL优化-秒级优化,hint让IN子查询当驱动表

c9c815d63c30e6072668003db500fbbd.png

在sql优化中,一个比较重要的一点就是驱动表的选择,HASH JOIN和NEST LOOP来说驱动表的选择是至关重要的。
对于NEST LOOP说最好是小表作为驱动表,与大表的连接键上减少索引,并且保证索引的选择性比较好。
对于HASH JOIN小表作为驱动表是要HASH进内存的,所以也要保证不能太大,如果HASH JOIN的都是大表,我们会在日后来分析怎么优化。
具体SQL是走HASH JOIN好还是NEST LOOP好, 日后也会说说我的理解。
今天说的这个案例是存在IN的子查询,其实原理相同。
select ht.fwid as fwid,
ht.htcode as htcode,
ht.id as htid,
ht.htbadjh as htbadjh,
ht.fwdmffbh as fwdmffbh,
cxmsfxm as cxmsfxm,
cxmsfzjhm as cxmsfzjhm,
ht.fwdmxzqhdm as fwdmxzqhdm,
ht.fwdm as fwdm,
ht.fwdz as fwdz,
ht.jzmj as jzmj,
ht.fwyt as fwyt,
ht.qdrq as qdrq,
ht.basj as basj
from ha_SPFHT.tpn_xshtqd ht where
id in
( select htid
from ha_SPFHT.tpn_htjydx jydx
where jydx.rylx = 2
and jydx.ryxm like '%XXX%'
and (jydx.zjhm is null or jydx.zjlb is null or (jydx.zjlb != 1 or jydx.zjhm like '%E122531385%'))
)
子查询返回2条数据,整个SQL要运行几十分钟。
SQL走的是HASH JOIN, 理论上没什么问题,但是我们有更好的选择。

b80ac4869b8bb326669deb056870dd97.png


select /*+ leading(jydx) use_nl(ht,jydx) */ ht.fwid as fwid, --1.5S---0.5S
ht.htcode as htcode,
ht.id as htid,
ht.htbadjh as htbadjh,
ht.fwdmffbh as fwdmffbh,
cxmsfxm as cxmsfxm,
cxmsfzjhm as cxmsfzjhm,
ht.fwdmxzqhdm as fwdmxzqhdm,
ht.fwdm as fwdm,
ht.fwdz as fwdz,
ht.jzmj as jzmj,
ht.fwyt as fwyt,
ht.qdrq as qdrq,
ht.basj as basj
from ha_SPFHT.tpn_xshtqd ht where
id in
( select htid
from ha_SPFHT.tpn_htjydx jydx
where jydx.rylx = 2
and jydx.ryxm like '%XXX%'
and (jydx.zjhm is null or jydx.zjlb is null or (jydx.zjlb != 1 or jydx.zjhm like '%E122531385%'))
)

a1635cf9ccde5ac72ca894469bb63dcc.png

a1635cf9ccde5ac72ca894469bb63dcc.png


在ryxm 建立索引了

989516a99bfe7e7803c0cdc3644cd799.png


最后sql在秒级完成

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值