执行sql次数太多,性能太差,有没有什么优化办法

尘力 2017-06-14 05:01:26
场景是这样的,首先得先从A表查出数据,大概有几千条,再根据每一条数据中的一个字段bz(标志)去判断再去查询哪个表,bz为1去查B表的数据,bz为2查询C表,bz为3查询D表。然后把不同的结果拼成一个Json字符串。
现在问题是,每次查出A表之后得再次判断再进行查询,如果结果太多,比如A表中查出1000条数据,就得一共建立和关闭数据库连接1001次,性能太差,有没有优化办法,求指教。
...全文
1015 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
人称小马哥 2017-06-22
  • 打赏
  • 举报
回复
不知道楼主用什么语言,就比如用java,你可以先一次性将A,B,C,D表需要的全部数据全部取出来,然后用java代码处理,比如从A、B、C、D取出来的结果集分别是list1、list2、list3、list4,接下来java代码处理就ok了, for(int i=0;i<list1.size();i++){ String s1 = list1.get(i);//bz if("1".equals(s1)){ //取list2集合数据处理业务场景 }else if("2".equals(s1)){ //取list3集合数据处理业务场景 }else if("3".equals(s1)){ //取list4集合数据处理业务场景 } }
刘温柔_ 2017-06-20
  • 打赏
  • 举报
回复
多表关联会优化代码、
尘力 2017-06-20
  • 打赏
  • 举报
回复
改成用in查询了,业务有点复杂,套了三层循环加两层if判断,一共五层,都快套晕了。。。
穿越清华 2017-06-19
  • 打赏
  • 举报
回复
可以考虑使用存储过程实现
什么都不能 2017-06-18
  • 打赏
  • 举报
回复
这种事当然要让数据库去做。楼上说的就可以。
zoro_天蝎 2017-06-16
  • 打赏
  • 举报
回复
select a.*,b.* from a,b where a.bz = b.bz and a.bz = 1 UNION select a.*,c.* from a,c where a.bz = c.bz and a.bz = 2 UNION select a.*,d.* from a,d where a.bz = d.bz and a.bz = 3 不知道理解的是不是准确 楼主仅作参考吧
那年冬天丶 2017-06-16
  • 打赏
  • 举报
回复
我的建议是写3条sql 当bz为1,2,3的时候,用A表和B,C,D做表连接 查出来的数据,然后用java做处理,这边可以避免在数据库端消耗资源。对业务不是很了解,自己可以判断一下。
  • 打赏
  • 举报
回复
引用 10 楼 ylovep 的回复:
首先得先从A表查出数据,大概有几千条 你把bz为1去查B表的数据,bz为2查询C表,bz为3查询D表 一起查询不就ok了 例如1的数据200条 ,2的数据300条,3的数据5条 查询条件改成in 批量一起查不就省了很多次查询数据库的io消耗
引用 8 楼 YZCSzhiYZTY 的回复:
select case when A.bz = 1 then (select * from B) when A.bz = 2 then (select * from C) else select * from D end from A
这两位的建议都不错
ylovep 2017-06-15
  • 打赏
  • 举报
回复
首先得先从A表查出数据,大概有几千条 你把bz为1去查B表的数据,bz为2查询C表,bz为3查询D表 一起查询不就ok了 例如1的数据200条 ,2的数据300条,3的数据5条 查询条件改成in 批量一起查不就省了很多次查询数据库的io消耗
xwn_2016 2017-06-15
  • 打赏
  • 举报
回复
引用 4 楼 chenli1 的回复:
[quote=引用 1 楼 xwn_2016 的回复:] 改成1次连接来干这事啊,连接建在循环外,等所有的都处理完了再关闭连接
主要是必须得进行判断从A表中查到的数据,一次连接判断不了吧[/quote] 我用的springmvc SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,false); try{ //处理业务 增删改查 for(){ } }catch(){ session.rollback();//回滚 }finally{ session.close();//关闭 }
  • 打赏
  • 举报
回复
select case when A.bz = 1 then (select * from B) when A.bz = 2 then (select * from C) else select * from D end from A
偏安zzcoder 2017-06-14
  • 打赏
  • 举报
回复
尽量用一条sql语句不就好了
feir8510 2017-06-14
  • 打赏
  • 举报
回复
1. 另外,现在SQL有session的概念,基本上不会每次都去建立数据库连接。 2. BCD数据表的量级也没有描述,如果是亿级别的(单条查询速度比较慢),可以先优化索引,把单条查询效率提升上来。 3. 一个SQL语句解决性能不行么?
qq_35243821 2017-06-14
  • 打赏
  • 举报
回复
bz为1去查B表的数据,bz为2查询C表,bz为3查询D表 根据bz的不同值分表查询,然后数列拼接
尘力 2017-06-14
  • 打赏
  • 举报
回复
引用 1 楼 xwn_2016 的回复:
改成1次连接来干这事啊,连接建在循环外,等所有的都处理完了再关闭连接
主要是必须得进行判断从A表中查到的数据,一次连接判断不了吧
香烟love彬 2017-06-14
  • 打赏
  • 举报
回复
可以试试加索引或者用存储过程进行查询
qq_36423445 2017-06-14
  • 打赏
  • 举报
回复
sql语句里面也有when,other,这样子只需要连接一次,但是sql查询很复杂,你可以比较下哪个更快
xwn_2016 2017-06-14
  • 打赏
  • 举报
回复
改成1次连接来干这事啊,连接建在循环外,等所有的都处理完了再关闭连接

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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