SQL SERVER 视图优化经历
系统中要求对HIS数据进行效益统计,因为HIS数据是需要第三方提供接口导入的,不清楚数据量大小,所以视图以业务为主未对其做性能优化(当时编写试图时就是几条简单的测试数据)
如今在项目接口实施完成后查看视图执行效率,发现执行了很久很久,具体执行时间忘记了,书写不规范,性能两行泪
(HIS系统就提供了近三千万条数据)
发现不仅仅浪费了大量时间,还占用了大量内存空间
我首先就是想到了建索引,速度上快了些
然后查看视图代码,缩减代码量及关注执行时间
因为视图业务较复杂,涉及的表较多
首先对嵌套查询的语句单独测试,并优化
eg. 将一个原本用left join连接的操作进行优化(这几张表数据量很小,最多的四万条,最小的几百条)
很普通的左外链接,看一下现在的性能,如此简单的表连接加上了计算列后耗费了三十多秒😂,这个不能忍
主要开销集中在计算上
而且注意看这个箭头很粗,表明数据量很大,在这里产生了四千四百万的数据,占用了1.7GB空间,对内存的消耗挺严重的
根据以上的结果,对于这段SQL,有两点可以优化
1、消除左外链接
2、计算列计算之前尽可能减少数据量
准备优化
我们先看看内连接和左外链接的定义
内连接:内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。
左外联接:左外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
从定义来看内连接的效率要高一些,所以要尽可能的消除左外链接
select子句中包含了很多计算列,这让CPU开销不小,所以我打算分开计算列,来达到计算时数据量较小的可能,代码优化后如下
优化后执行速度😱,被惊讶到了
瞬间有动力继续优化了,虽然刚才优化的是最简单的一部分,如图🙃
By听雨的人