问题:
系统由于模块众多,待办工作台查询需要流程历史记录关联每个业务主表进行待办信息table展示,也支持根据多查询条件组合查询。现有待办查询是使用视图union 拼了十几个模块,导致查询性能很低,查询耗时20秒左右。
解决方案:
从业务层面分析到每个用户一般只有其中个别模块的待办,大部分都只有4个以下模块, 于是把视图sql放到代码里面, 通过动态获取用户的待办模块,进行动态拼接union (即用户当前拥有哪些模块的待办就union哪些模块),避免不必要的union部分影响性能 。
还有发现很多模块关联有某个视图特别影响性能,分析到这个视图只是为了某个查询条件服务,于是做了一个区分,用户没有输入这个查询条件时则sql不关联这个视图。
做了上面的改造,基本稳定2秒以内了,当然后期还可以通过增加索引等进一步优化。
另外,如果允许重复的值或自信不会重复,请使用 UNION ALL ,查询性能会比UNION高。