sql问题

我需要统计手机号下有多少管辖的省和医院。但是省在视图中。医院在另外两个关联表中。

所以不能一次查询出省和医院的总计。但是加入union之后  运行时间太长,报表根本打不开。所以请教下各位大佬 有没有什么好的办法。下面是我的sql

select sum(amount)/10000 as amount,sum(people) as people,sum(part) as part,date_format(createtime, '%Y/%m') as createtime from rims_reporting_image_review where PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( createtime, '%Y%m' ) ) <=11 and audit_status = 1 and agent_fk in 

(

select agent_uuid

from view_permission_agent 

where username = '" + username + "'

and agent_state = '1' 

and agent_parent_erp is null 

group by agent_uuid

union

select g.uuid from 

rims_basic_user u 

INNER JOIN rims_basic_area_user a on a.user_fk = u.uuid 

INNER JOIN rims_basic_logic_area l on a.area_fk = l.uuid 

INNER JOIN rims_basic_agent g on g.uuid = l.agent_fk 

where u.mobile = '"+username+"'

and g.state = '1'

and g.parent_project_erp is null 

) group by date_format(createtime,'%Y%m')


郝波 发布于 2020-1-15 11:15
1min目标场景问卷 立即参与
回答问题
悬赏:4 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
0
ooshanghaiLv5初级互助
发布于2020-1-15 13:18(编辑于 2020-1-15 13:24)

这是个性能问题,你这个脚本里有几处是明显没有经过性能调优的:

  1. 不要用in,用exist

  2. 尽量不要在表达式中用函数比如这里的PERIOD_DIFF,拆分成and条件都比这个快

  3. 不要用union,用union all 因为union会自动执行 SELECT DISTINCT all columns 操作

  4. 尽量不要用is null ,比如g.parent_project_erp is null ,当然这里需要其他部门配合了


另外,建议你在sql中使用临时表,

--------------------------------------------------------------------------------------------------------

SELECT T.agent_uuid

INTO #TEMP

FROM

(

select agent_uuid

from view_permission_agent 

where username = '" + username + "'

and agent_state = '1' 

and agent_parent_erp is null 

group by agent_uuid

union all

select g.uuid from 

rims_basic_user u 

INNER JOIN rims_basic_area_user a on a.user_fk = u.uuid 

INNER JOIN rims_basic_logic_area l on a.area_fk = l.uuid 

INNER JOIN rims_basic_agent g on g.uuid = l.agent_fk 

where u.mobile = '"+username+"'

and g.state = '1'

and g.parent_project_erp is null 

) T


--------------------------------------------------------------------------------------------------------


select sum(A.amount)/10000 as amount,sum(A.people) as people,sum(A.part) as part,date_format(A.createtime, '%Y/%m') as createtime

from rims_reporting_image_review A

where PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( A.createtime, '%Y%m' ) ) <=11 and A.audit_status = 1 

 AND EXISTS (SELECT agent_fk FROM #TEMP B WHERE B.agent_fk = A.agent_uuid )


group by date_format(A.createtime,'%Y%m')


--------------------------------------------------------------------------------------------------------


DROP TABLE #TEMP



1111111.png



如果还是性能有问题,你需要

  1. 开启帆软共享内存或者磁盘

  2. 给unionall 上下两端表格中根据你的where条件和 inner条件 添加索引

最佳回答
0
牛~~~Lv6中级互助
发布于2020-1-15 13:00

感觉你写的有点复杂了,你是只要统计合计吗?

agent_uuid 与 g.uuid 有重复的吗?没有的话建议直接用 union all

  • 3关注人数
  • 385浏览人数
  • 最后回答于:2020-1-15 13:24
    请选择关闭问题的原因
    确定 取消
    返回顶部