SQL SERVER 视图优化经历

系统中要求对HIS数据进行效益统计,因为HIS数据是需要第三方提供接口导入的,不清楚数据量大小,所以视图以业务为主未对其做性能优化(当时编写试图时就是几条简单的测试数据)

如今在项目接口实施完成后查看视图执行效率,发现执行了很久很久,具体执行时间忘记了,书写不规范,性能两行泪

(HIS系统就提供了近三千万条数据)

发现不仅仅浪费了大量时间,还占用了大量内存空间

我首先就是想到了建索引,速度上快了些

 

然后查看视图代码,缩减代码量及关注执行时间

因为视图业务较复杂,涉及的表较多

首先对嵌套查询的语句单独测试,并优化

eg.   将一个原本用left join连接的操作进行优化(这几张表数据量很小,最多的四万条,最小的几百条)

很普通的左外链接,看一下现在的性能,如此简单的表连接加上了计算列后耗费了三十多秒😂,这个不能忍

 

主要开销集中在计算上

而且注意看这个箭头很粗,表明数据量很大,在这里产生了四千四百万的数据,占用了1.7GB空间,对内存的消耗挺严重的

 

 根据以上的结果,对于这段SQL,有两点可以优化

1、消除左外链接

2、计算列计算之前尽可能减少数据量

 

准备优化

我们先看看内连接和左外链接的定义

内连接:内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

左外联接:左外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       

从定义来看内连接的效率要高一些,所以要尽可能的消除左外链接

 

select子句中包含了很多计算列,这让CPU开销不小,所以我打算分开计算列,来达到计算时数据量较小的可能,代码优化后如下

 

 

优化后执行速度😱,被惊讶到了

瞬间有动力继续优化了,虽然刚才优化的是最简单的一部分,如图🙃

 

posted @ 2019-04-25 14:58  听雨的人  阅读(3473)  评论(0编辑  收藏  举报