SQL group by 数据量大卡顿的 优化办法

163 阅读2分钟

问题

用于构建视图的语句中group by的表数据量过大, 40w条.

解决办法

  1. 分区分表, 将没有关联性的数据, 按数据区域分开存储, 这样检索指定目标的数据时, 检索量大大减小
  2. 对group by语句增加where过滤条件, 实测 少量条件能提高检索效率. 实测对于 值数量区别大的 有明显增速效果; 对于 值数量少的, 起反作用, 减慢查询速度. 比如字段1 有 1200种值, 对其使用 in 条件, 能提高速度; 字段2有60种值, 对于40w条数据来说, 基本忽略不计, 使用 =或者in条件都会降低速度.

遇到离谱问题, Rider编辑器的数据库工具有坑

  1. Rider编辑器可能存在一些特殊程序, 当添加一堆不使用的with表达式语句时, 查询速度正常. 当把这些无用语句删除, 就会延长查询速度10倍有余. 此问题是通过在ssms上执行语句时测试出来的, 在ssms上, 无论加不加一堆无用with表达式代码, 都非常快.这说明在rider内置的数据库工具里有特殊的处理程序, 这不利于对SQL语句的正常查询与优化测试.

  2. 在Rider编辑器中将速度很快的语句封装成视图, 查询视图时, 速度慢十倍, 1秒对比10余秒. 反复调试语句, 看不出问题, 然后换ssms查询该视图时, 效果与原语句速度一样, 没有Rider中出现的慢10倍的情况. 这说明Rider编辑器使用的SDK或者协议存在问题, 导致同样的简单语句会存在如此大的速度差距.