6 图助你理解 SQL 优化策略
小编:啊南 196阅读 2020.11.30
案例
在本例中,举一个表函数( table-valued function)来说明下 rewind, rebind 微妙的关系。
函数的意图很明显,根据 PK 拿到表中其他的几个字段,封装成表返回。
第一种写法:
在这里,说先要说明的是 EXT_GAP_EMP 是一张从表,EXT_GAP_INITIATIVES 是主表。通过 GAP_ID 来关联。因此 EXT_GAP_EMP 与 EXT_GAP_INITIATIVES 是多对一的关系。而表值函数(Table Valued Functions)将会重复的去捞取同一个 GAP_ID 下的多个属性,因此 产生了大量的数据。聪明的你肯定在想,如果这些重复拉取的过程可以将之前的数据都缓存起来,就能提高性能。没错,你想到的方案,微软那帮子牛上天的工程师也想到了。如果你认识轮子哥,你可以求证下,当年他在 SQL Server 做过优化器的引擎开发。我在他隔壁 :)。言归正传,我用图证明:
标红的 Actual Rewinds 就是将连续同值的 GAP_ID 返回的结果缓存起来,以快速返回给下一个等值的 GAP_ID. 而 Actual Rebinds 统计的就是有多少次连续同值的 GAP_ID 出现。一定是连续同值,连续同值,连续同值!
一定要将上面的例子好好理解,继续往下看才能保证理解的了!
第二种写法:
接下来,我不标红 SQL 的修改部分,可能大多数读者都不会注意。请仔细看 SQL 的变化。因为 Execution Plan 变得完全不一样了,有了 sort 反而变快了,是不是很难理解?因为我们一直在优化部分强调不要用 order by 来进行排序,尽量避免 sort 操作。对于 rewind, rebind 来说,情况变了
细心的你,发现了没,标红部分 Actual Rebinds 减少了至少 3 倍。意味着 Actual Rewinds 有效提高了缓存。
前面一篇对 SQL 运行时执行统计信息的文章,提到的收集执行统计信息的方法,还记得吗,SET Statistics IO/TIME ON, 可以派上用场了。我们来比较下两段 SQL 的异同:
CPU 时间少了至少 3 倍,而执行流失时间则少了近 1 倍!原因全在于 ORDER BY GEMP.GAP_ID !
相关推荐
- SQL Server 常用函数 1.获取当前时间--GetDate()2.DatePart() 函数3.字符串截取--substring三个参数,第一个参数需要截取的,第二个参数,截取字符串的起始位置(起始位置是1),第三个参数需要截取字符串的长度。4.日期增减函数-DateAdd三个参数,第一参数合法的日期表达式,第二个参…
- 3DMAX提示和技巧 本主题标识使用 Civil View 的一些重要提示和技巧。常规使用屏幕分辨率至少为 1280x1024 的 Civil View。低于此分辨率时,一些面板将占用过多屏幕空间。 将视口设置为线框显示以达到最佳性能。 要尽可能简化用户界面,请在单个视口中工作并关闭 3ds Max 命令面…