求SQL查询优化

本人QQ-554433626 2019-02-15 03:06:04

SELECT *
FROM (SELECT ROW_NUMBER() OVER(order by TMPKSNF DESC, TMPKSBH DESC) AS Ro,
T.*
from (SELECT max(ml.mlwsbh) MLWSBH,
ml.bmsah,
JZ.JZSCRXM,
JZ.JZSCRGH,
JZ.CJSJ,
JZ.AJBH,
JZ.WSBH,
JZ.WSMC,
JZ.ZZZT,
JZPZ,
JZSHRBH,
JZSHR,
JZSHSJ,
JZ.JZBH,
jz.ZHXGSJ,
MBMC,
AJMB_BM AJLB_BM,
jz.DWBM CBDW_BM,
JZ.SFSC,
AJZT_F,
(select nvl2(max(wjxh), count(wjxh), null) ||
nvl2(max(wjxh), '-', null) ||
sum(case
when (select to_date(sysdate - configvalue) b
from XY_DZJZ_XTPZ
where configid = 15) < w.jzczsj then
'0'
else
'1'
end) as SFTX
from yx_dzjz_jzmlwj w
left join yx_dzjz_jzml m
on w.mlbh = m.mlbh
where m.mllx = 0
and m.bmsah = ml.bmsah) LSQ,
to_number(replace(replace(lower(substr(max(ml.MLWSBH),
0,
instr(max(ml.MLWSBH),
'/',
1,
1) - 1)),
's',
'-2'),
'm-',
-4)) TMPKSBH,
to_number(substr(max(ml.MLWSBH),
instr(max(ml.MLWSBH), '/', 1, 1) + 1,
decode(instr(max(ml.MLWSBH),
'/',
1,
2),
0,
length(max(ml.MLWSBH)) -
instr(max(ml.MLWSBH), '/', 1, 1),
instr(max(ml.MLWSBH), '/', 1, 2) -
instr(max(ml.MLWSBH), '/', 1, 1) - 1))) TMPKSNF
FROM yx_dzjz_jzml ml
join yx_dzjz_jzjbxx jz
on ml.jzbh = jz.jzbh
where 1 = 1
and ml.sfsc = 'N'
and jz.sfsc = 'N'
and sslbbm = '000000-000004'
group by ml.bmsah,
JZ.JZSCRXM,
JZ.JZSCRGH,
JZ.CJSJ,
JZ.AJBH,
JZ.WSBH,
JZ.WSMC,
JZ.ZZZT,
JZPZ,
JZSHRBH,
JZSHR,
JZSHSJ,
JZ.JZBH,
jz.ZHXGSJ,
MBMC,
AJMB_BM,
jz.DWBM,
JZ.SFSC,
AJZT_F) T
where 1 = 1
and MBMC <> '模式'
and trim(AJLB_BM) = '0701'
and AJZT_F || AJLB_BM in ('0701', '00701', '30701', '40701')
and ZZZT in (2, 3, 4, 5, 6)
and SFSC = 'N'
and trim(CBDW_BM) in (select distinct trim(QXBM)
from xt_dm_qx a
join XT_QX_RYJSFP b
on trim(a.jsbm) = b.jsbm
and trim(a.bmbm) = b.bmbm
and trim(a.dwbm) = b.dwbm
and gh = '0000'
and b.dwbm = '440300000000'
and a.qxlx = 0)
and trim(AJLB_BM) in (select distinct trim(QXBM)
from xt_dm_qx a
join XT_QX_RYJSFP b
on trim(a.jsbm) = b.jsbm
and trim(a.bmbm) = b.bmbm
and trim(a.dwbm) = b.dwbm
and gh = '0000'
and b.dwbm = '440300000000'
and a.qxlx = 1)) TT
WHERE TT.Ro between 1 and 50




总数据量就5W。ZZZT匹配的量大就非常慢,匹配的量少就很快。in (select改为exists也不行。
...全文
437 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
AHUA1001 2019-03-04
  • 打赏
  • 举报
回复
太长了,没有数据,看的太头疼,但是有一个问题是肯定的,IN后边的返回结果里,用DISTINCT是很影响效率的。因为IN后边只关心有没有,有几个都一样。
早起晚睡 2019-03-04
  • 打赏
  • 举报
回复
最好别用IN 用in很影响结果!!!!
yaiger 2019-02-26
  • 打赏
  • 举报
回复
最简单的方式就是建立索引
本人QQ-554433626 2019-02-26
  • 打赏
  • 举报
回复
引用 14 楼 yaiger 的回复:
yx_dzjz_jzjbxx表按zzzt分组统计一下数量,把结果贴上来看看
怎么避免全表扫描
yaiger 2019-02-20
  • 打赏
  • 举报
回复
另外,这些表做过分析吗?
yaiger 2019-02-20
  • 打赏
  • 举报
回复
去掉了以后的执行计划贴一下
yaiger 2019-02-20
  • 打赏
  • 举报
回复
yx_dzjz_jzjbxx表按zzzt分组统计一下数量,把结果贴上来看看
本人QQ-554433626 2019-02-20
  • 打赏
  • 举报
回复
引用 10 楼 yaiger 的回复:
去掉了以后的执行计划贴一下
主要是这个查询要走53137(表yx_dzjz_jzml数据量)* 53109(表yx_dzjz_jzjbxx数据量) 的全表扫描模式
queencloud 2019-02-20
  • 打赏
  • 举报
回复
或者可以先用with吧
yaiger 2019-02-19
  • 打赏
  • 举报
回复
从执行计划来看,yx_dzjz_jzmlwj这张表成本最大,想办法优化一下下面的代码
select nvl2(max(wjxh), count(wjxh), null) ||
nvl2(max(wjxh), '-', null) ||
sum(case
when (select to_date(sysdate - configvalue) b
from XY_DZJZ_XTPZ
where configid = 15) < w.jzczsj then
'0'
else
'1'
end) as SFTX
from yx_dzjz_jzmlwj w
left join yx_dzjz_jzml m
on w.mlbh = m.mlbh
where m.mllx = 0
and m.bmsah = ml.bmsah

从执行计划,yx_dzjz_jzmlwj是全表遍历,这张表的数据量是多少?
另外它左外关联 yx_dzjz_jzml表, yx_dzjz_jzml在外层有个条件sfsc = 'N',在这个SQL能否用上?
不行的话,可以考虑用with把这段SQL单独抓取出来

本人QQ-554433626 2019-02-19
  • 打赏
  • 举报
回复
引用 8 楼 yaiger 的回复:
从执行计划来看,yx_dzjz_jzmlwj这张表成本最大,想办法优化一下下面的代码
select nvl2(max(wjxh), count(wjxh), null) ||
                                 nvl2(max(wjxh), '-', null) ||
                                 sum(case
                                       when (select to_date(sysdate - configvalue) b
                                               from XY_DZJZ_XTPZ
                                              where configid = 15) < w.jzczsj then
                                        '0'
                                       else
                                        '1'
                                     end) as SFTX
                            from yx_dzjz_jzmlwj w
                            left join yx_dzjz_jzml m
                              on w.mlbh = m.mlbh
                           where m.mllx = 0
                             and m.bmsah = ml.bmsah
从执行计划,yx_dzjz_jzmlwj是全表遍历,这张表的数据量是多少? 另外它左外关联 yx_dzjz_jzml表, yx_dzjz_jzml在外层有个条件sfsc = 'N',在这个SQL能否用上? 不行的话,可以考虑用with把这段SQL单独抓取出来
我把查询这个字段的sql去掉了 速度是一样的
  • 打赏
  • 举报
回复
引用 5 楼 本人QQ-554433626 的回复:
[quote=引用 3 楼 胖叔叔写代码 的回复:]
[quote=引用 2 楼 本人QQ-554433626 的回复:]
[quote=引用 1 楼 胖叔叔写代码 的回复:]
建议临时表join解决,不然速度慢是肯定的。


求具体优化?[/quote]
报一下你的sql版本,然后我下午回家看倒腾写一个[/quote]
oracle 11[/quote]
对不起啊,我不太用oracle的,你找个别人帮你看看吧。
本人QQ-554433626 2019-02-18
  • 打赏
  • 举报
回复
引用 3 楼 胖叔叔写代码 的回复:
[quote=引用 2 楼 本人QQ-554433626 的回复:] [quote=引用 1 楼 胖叔叔写代码 的回复:] 建议临时表join解决,不然速度慢是肯定的。
求具体优化?[/quote] 报一下你的sql版本,然后我下午回家看倒腾写一个[/quote] oracle 11
nayi_224 2019-02-18
  • 打赏
  • 举报
回复
可以试一下with /*+ materialize */
本人QQ-554433626 2019-02-18
  • 打赏
  • 举报
回复
引用 6 楼 胖叔叔写代码 的回复:
[quote=引用 5 楼 本人QQ-554433626 的回复:] [quote=引用 3 楼 胖叔叔写代码 的回复:] [quote=引用 2 楼 本人QQ-554433626 的回复:] [quote=引用 1 楼 胖叔叔写代码 的回复:] 建议临时表join解决,不然速度慢是肯定的。
求具体优化?[/quote] 报一下你的sql版本,然后我下午回家看倒腾写一个[/quote] oracle 11[/quote] 对不起啊,我不太用oracle的,你找个别人帮你看看吧。[/quote] 没人咯
  • 打赏
  • 举报
回复
引用 2 楼 本人QQ-554433626 的回复:
[quote=引用 1 楼 胖叔叔写代码 的回复:] 建议临时表join解决,不然速度慢是肯定的。
求具体优化?[/quote] 报一下你的sql版本,然后我下午回家看倒腾写一个
本人QQ-554433626 2019-02-15
  • 打赏
  • 举报
回复
引用 1 楼 胖叔叔写代码 的回复:
建议临时表join解决,不然速度慢是肯定的。
求具体优化?
  • 打赏
  • 举报
回复
建议临时表join解决,不然速度慢是肯定的。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧