2 sinat 33460472 sinat_33460472 于 2018.08.10 17:32 提问

SQL写的太长,效率不高,查询问题优化 5C
sql

经理说,下面这个SQL可读性太差了,让我改改,看的我一脸懵逼,麻烦大神帮我改改。
SELECT YBB.JGBJLIST_CPMC AS CPMC,
YBB.{0} AS YBBJG,
MBBB.{0} AS MBBBJG,
YBB.JGBJLIST_CPID,
YBB.JGBJLIST_PARENTID,
(MBBB.{0}-YBB.{0}) as JDC,
case when YBB.{0}=0 then '0%' else round(((MBBB.{0}-YBB.{0})/YBB.{0})*100,2) ||'%' end as XDC
FROM JGBJLIST YBB
LEFT JOIN JGBJLIST MBBB
ON YBB.JGBJLIST_CPID = MBBB.JGBJLIST_CPID
WHERE YBB.JGBJLIST_BJBBID =:YBBID
AND MBBB.JGBJLIST_BJBBID =:MBBBID
UNION ALL
SELECT BJ.JGBJLIST_CPMC AS CPMC, BJ.{0} AS YBBJG, null AS MBBBJG,BJ.JGBJLIST_CPID,
BJ.JGBJLIST_PARENTID,
(0-BJ.{0}) as JDC,
case when BJ.{0}=0 then '0%' else round(((0-BJ.{0})/BJ.{0})*100,2) ||'%' end as XDC
FROM JGBJLIST BJ
WHERE BJ.JGBJLIST_CPID NOT IN
(SELECT YBB.JGBJLIST_CPID
FROM JGBJLIST YBB
LEFT JOIN JGBJLIST MBBB
ON YBB.JGBJLIST_CPID = MBBB.JGBJLIST_CPID
WHERE YBB.JGBJLIST_BJBBID =:YBBID
AND MBBB.JGBJLIST_BJBBID =:MBBBID )
AND JGBJLIST_BJBBID =:YBBID
UNION ALL
SELECT BJ.JGBJLIST_CPMC AS CPMC, null AS YBBJG, BJ.{0} AS MBBBJG,BJ.JGBJLIST_CPID,
BJ.JGBJLIST_PARENTID,
(BJ.{0}-0) as JDC,
'0%'as XDC
FROM JGBJLIST BJ
WHERE BJ.JGBJLIST_CPID NOT IN
(SELECT YBB.JGBJLIST_CPID
FROM JGBJLIST YBB
LEFT JOIN JGBJLIST MBBB
ON YBB.JGBJLIST_CPID = MBBB.JGBJLIST_CPID
WHERE YBB.JGBJLIST_BJBBID = :YBBID
AND MBBB.JGBJLIST_BJBBID = :MBBBID )
AND JGBJLIST_BJBBID =:MBBBID

10个回答

devmiao
devmiao   2018.08.10 23:11
u010012710
u010012710   2018.08.12 01:32

不考虑存储效率的话,可以考虑建新表,多表关联的方式,这样可以加强可读性。

weixin_42667770
weixin_42667770   2018.08.12 16:14

把公用表先查询,做成临时表或者变量表,每张表注释好,然后在这些表的基础上再做二次查询,这样可读性就能大幅提升

niaonao
niaonao   2018.08.13 09:28

拆分SQL
中间表
使用业务处理SQL的业务

hometing218
hometing218   2018.08.13 09:34

可以先把带有的查询条件的查出来,剩余的一些需要字段可以额外在重新查一次

Life_s
Life_s   2018.08.13 11:25

可以考虑建新表,多表关联

I08002726
I08002726   2018.08.14 22:53

业务拆分、写子查询。

JonathanYan
JonathanYan   2018.09.19 11:01

考虑下写成函数?两个括号内侧select查询重复了。而且没太懂第2,3个select中的not in想做什么,逻辑是从JGBJLIST中选出CPID不在 [ JGBJLIST左结合 JGBJLIST ](为什么同一张表还要左结合)中的项,想从一张表中查询id不在这张表中的表项?这里的逻辑可以再考虑一下,其次就是楼上说的运算可以放在业务层进行。

u014437234
u014437234   2018.08.11 09:18

在写sql时,尽量避免参数在数据库端进行运算,尽量将计算逻辑放到程序中去处理;
case when 看下能不能去掉
not in 中的数据 能否直接传入,不要直接去查询
避免过多的子查询,希望能帮到你

zhaomin_g
zhaomin_g   2018.08.11 12:35

业务太复杂建议使用存储过程

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Hibernate之查询效率问题
相信越来越多的web开发者,在持久层都采用了hibernate。都说hibernate效率高,可是当整个项目下来后发现,比 其他持久层版本慢很多,当然功能也多很多。记得当初同事测试hibernate销率时,在100万数据量的情况下,hibernate的效率 几乎接近于jdbc,那么为什么如今很多公司的项目运行那么慢呢(不仅仅是hibernate),也许有些细节上的东西我们开发人员没有注意。
Sql中EXISTS与IN的效率问题
根据两张表大小不同选择EXSIST、IN
常见sql语句效率优化方式
数据库sql优化
sql优化----不同写法下group by 的影响
今天要对实现这样的一个统计效果的sql进行优化。 分析:可以看出此统计是要求针对经销商,车系两个维度对试驾次数和潜客数两个指标进行统计,试驾率是由这两个指标进行计算而得到。 1、维度:经销商,车系 2、指标:试驾次数,潜客数 原版sql如下: 分析问题:此sql给人的第一印象就是用了子查询效率低,事实它确实特别慢。而且对于不熟悉业务的人来说想看懂很痛苦。     所以我选择了重
sql优化(查询大数据量时sql执行时间过长)
问题:Oracle数据库 sql查询的优化(成交额统计表的sql查询时间过长进行的优化) 解决办法:对sql语句中使用视图的部分替换为子查询,对查询表条件字段建立索引 引发的问题:在什么情况下建立索引,及建立索引后引发的开销有哪些 经查询oracle的索引机制,摘录如下: 索引可以提高数据查询的效率,并不仅仅在于数据库会自动按照顺序进行搜寻。另一个重要的方面是索引的按块维护策略。一本字典的
sql语句中in后面的数据过多报错,或效率低
select * from tbl whereitemid in () or in() in 里面最多1000个itemid ,sql语句最长65535 字节 解决方案: 1.建立临时表 2.In() or in();
mysql in 查询效率慢优化
mysql> select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839'); 为了节省篇幅,省略了输出内容,下同。 67 rows in set (12.00 sec) 只有67行数据返回,却花了12秒,而系统中可能同
EF学习和使用(七)EF性能优化篇
自从ITOO平台旗下的评教系统问世之后,其性能问题引起了轩然大波。CPU占用过高,页面反映速度超慢,根本无法正常使用,为此我们专门成立一个性能优化小队,去研究为什么系统性能这么低,怎么优化性能?框架中用到了EntityFramework,WCF,EasyUI等技术,所以我们大胆猜测可能是这三方面影响了系统的整体性能。经过一段时间的研究和实践,发现我们在使用EF的过程中,由于经验原因对EF的不了解,不
Select SQL查询效率优化原则
1.尽量避免where中包含子查询; 2.where条件中,过滤量最大的条件放在where子句最后; 3.采用绑定变量有助于提高效率; 4.在索引列上使用计算、改变索引列的类型、在索引列上使用!=将放弃索引; 5.运算符效率:exists高于in高于or,(not exists高于not in); (这里指出:in和or都是效率较低的运算,但是in的效率:O(logn)仍然比or的效率:O
Oracle 使用 with as 优化重复查询
我们有时写的sql 会多次查询和使用相同的结果集,而事实上每次查询都会消耗资源和降低sql的整体查询效率,特别是对大量数据表,耗时特别长。 使用with as 将想要查询的数据集保存到一张虚表中,数据查询均从这张虚拟表(视图)中查询获得,减少对数据库的直接访问。 WITH SCCCE AS (SELECT A.CUST_ID,                 S.SUBS_ID,