《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.2 使用窗口函数的解决方案简介...

本节书摘来自异步社区出版社《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》一书中的第1章,第1.2节,作者: 【美】Itzik Ben-Gan,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 使用窗口函数的解决方案简介

T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数
本书前4章描述了窗口函数及其优化,所选素材偏重技术说明,虽然我自己觉得很吸引人,但可以想见,有些人会觉得有点沉闷。通常来说,人们在阅读用窗口函数解决现实问题的内容时,会觉得比较有趣,本书将在最后一章满足大家。只有当我们看到能如何用窗口函数解决难题时,才会真正认识到它们的价值。所以,我在思考如何说服你在读到有趣的章节之前,能坚持读完这些枯燥的技术说明而不中途放弃。也许我可以展示一个窗口函数解决方案示例。

这里演示的查询包含:对一个在列中包含序列号的表进行查询,在现有值中找到连贯的区间。这个难题也就是所谓的数据岛问题。序列号可以是数值类型的、时间类型的(比较常见)或支持全排序的任意数据类型。序列号可以是唯一值,也可以是重复值。间隔可以是任何符合列类型(如,整型数1、整型数7、时间间隔为1天、时间间隔为2周等)的固定间隔。第5章会讲述间隔的各种变化。这里只举个简单的案例,让大家感受一下窗口函数是如何工作的——所以用数值序列,间隔为1,首先用下面的代码来生成样本数据:

image

在表T1中,可以看到col1的序列号并不连续。我们的任务是找到现有值的连续区间(也称为数据岛,)返回每个数据岛的开始值和结束值,我们希望得到的结果如下:

image

如果我们好奇这类问题在现实中的使用场景,这里有很多实际例子。示例包括生成可用性报告,识别某种活动的持续时间(如,销售活动),找到满足一定要求的持续区间(如,股票高于或低于一定阈值的时间区间),识别车牌的使用范围等。当前示例的目的非常简单,我们可以专注在实现它的技术上。只须稍作调整,应用在简单案例上的技术就可以应用在更加复杂的案例上,所以请把它看成是一个基于集合的解决方案带来的挑战。首先请找出一个能解决问题的方案,然后对表填充大量的数据行(假设10 000 000行)然后再试试刚才的解决方案,看看它将如何进行。完成这些,我们再来看我的解决方案。

在展示使用窗口函数的方案之前,我先展示其中一个用传统语言结构实现的解决方案。特别地,我会展示使用子查询的解决方案。为了解释第一种解决方案的策略,先查看T1.col1序列的值,我增加了一个目前尚不存在的概念化的列,把它当做组标识符:

image

grp列尚未存在,从概念上来说,它的值唯一地标识一个数据岛。这就意味着,对同一个岛内的所有成员,它们的grp值相同,并与其他岛内的成员的grp值不同。如果我们能设法对这样的组标识符进行计算,我们就能把结果根据grp特性值进行分组,返回每组(岛)中最大和最小的col1值。传统语言结构中生成这个组标识符的方法是:针对col1的每个当前值,找到大于或等于当前值的最小的col1值,并且要求这个值后面没有值。

举例说明,按照上面的逻辑,试着找到相对于值2,col1的值大于或等于2的最小值,且要求其后面的值没有连续,答案是3。现在,针对3,做同样的查找,结果还是3,所以3是组标识符,数据岛开始于2,结束于3。对于开始于11,结束于13的数据岛,组成员的标识符都是13。从这里我们可以看到,一个数据岛内的所有成员的组标识符,实际上就是数据岛最后一个成员的值。

下面是实现这个概念的T-SQL代码。

image

代码执行后的输出结果如下:

image

下面的部分就相当直观了——根据上面的查询定义表表达式,在外部查询中,根据组标识符进行分组,返回每组的最大和最小的col值,如下。

image

在这个解决方案里,有两个主要问题。一、这里遵循的逻辑有点复杂。二、运行非常缓慢。我暂时不想开始讨论查询执行计划——后面的篇幅有很多这方面的讨论——在这儿可以告诉大家,针对表中的每一行,SQL Server都几乎执行了两次完整的数据扫描。现在可以想象对于10 000 000条记录组成的序列,尝试转化它对应的工作量会有多少了。需要处理的行的数量只有一个词形容——巨大。

另一个解决方案也是计算组标识符,不同之处是,使用窗口函数进行。解决方案的第一步是使用ROW_NUMBER函数基于col1排序计算行号。本书后面会提供ROW_NUMBER的细节。目前,只要知道它在分区中,按照给定的顺序,从1开始,逐一递增,产生唯一的整数就足够了。

牢记上面的知识,下面的查询按照col1排序,返回的col1的值和行号。

image

现在,我把注意力集中到两个序列上。一个(col1)是不连贯的,另一个(rownum)是连贯的。记住这一点,然后尝试发现在一个数据岛内,二者有什么独特的关系。在数据岛内,两个序列都以固定间隔在增长,因此,二者的差异是一个常数。在另一个岛内,col1的增量超过1,而rownum的增量还是1,所以差异在变大。换句话说,二者的差异是常数,不同数据岛内的数值不同。运行下面的查询来计算其差异。

image

我们可以看到,这个差异满足我们对组标识符的两个需求,因此,可以把它当做组标识符使用。其他内容都与之前的解决方案相同,即是说,把行按组标识符进行分组,返回每组中最小和最大的col1值,如下所示。

image

请观察一下,这样的解决方案多么清晰和简单。同时,在代码上加上注释,帮助那些第一次读代码的人更好地了解解决方案,也是个不错的主意。

这个解决方案还很高效。与前一解决方案相比,其所涉及的行的处理数量微不足道。它仅仅包含一个在col1上的排序索引扫描和一个持续递增计数器的迭代器。我测试过这条查询的性能,它在10 000 000条记录组成的序列上仅运行了10秒钟。前一解决方案的运行时间就要长得多。

希望关于使用窗口函数的解决方案的简介,能足以吸引你,让你看到它们包含的强大功能。现在,我们要返回继续学习窗口函数技术了,在书的后面部分,我们还有机会看到更多的示例。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一台定制商用NAS存储服务器

记得前不久在网络上看到有人在问有没有人将openfiler进行实际应用,以我看应该是有的,而且不少,你是否在用,或者曾经用过呢?LINUX加PC主机来定制各种应用型服务器,一直是我想去推广的,也就是如何…

[Java] java中的接口定义

在Java的通常规范中,对数据成员的修改要通过接口提供的方法进行(如下面示例中接口中的void learnMath(int hours)和void learnEnglish(int hours)),这个规范起到了保护数据的作用。用户不能直接修改数据,必须通过相应的…

ASP.NET Core(十)Configuration 配置优先级详解

ASP.NET Core 项目启动,默认执行顺序为:宿主 Host -> 读取配置 -> 日志设置 -> 注册服务(DI)-> 添加中间件 -> WebHost 监听 -> 后台 Work 启动。配置的加载和读取是在启动流程的最前面。微软关于 ASP.NET Core…

《BeagleBone开发指南》——1.7 小结

本节书摘来异步社区《BeagleBone开发指南》一书中的第1章,第1.7节,作者:【爱】Derek Molloy(莫洛伊),更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.7 小结 在完成本章后,你应该具备…

软件配置管理(一)配置管理概念与目标

软件配置管理的定义 软件配置管理(Software Configuration Management,SCM)是一组针对软件产品的追踪和控制活动,它贯穿于项目生命周期的始终,并代表软件产品接受各项评审。 软件配置管理的目的 软件配置管理是贯穿于整个软件过…

Android之运行Java.lang.UnsatisfiedLinkError的错误解决办法

1、问题 部分手机运行的时候在jni层出现这个错误,导致手机崩溃 Java.lang.UnsatisfiedLinkError 2、解决办法 是因为在我是这样写的 static {System.loadLibrary("");} 把报错的依赖加进去 static {System.loadLibrary("");System.loadLibrary("&q…

带中文索引的ListView 仿微信联系人列表

因为各种原因,项目经理和产品经理把我做的东西给否定了,所以决定分享出去。 主要功能: 1 、带中文索引的ListView 2、自己定义顶部搜索视图,能够对返回button,搜索button加入事件监听,带动画的咧&#xff0…

APP访问路径和销售归因分析

用户浏览路径是分析用户行为的关键,也是页面分析的关键。虽然可以很方便的获取到PV数据,但却无法知道用户是浏览哪些页面后来到当前页面,也不知道浏览过当前页面的用户又去了哪些其他页面。诸如此类的问题还有:某专题活动产生了多…

解决 ASP.NET Core 部署到 IIS,更新项目时文件夹正在使用错误

前言虽然 ASP.NET Core 应用程序是跨平台的,但我们还是经常将它部署到 Windows 的 IIS 下。当 ASP.NET Core 站点运行时,它会锁定正在使用的程序集,如果这时向站点目录下复制文件进行更新,会提示文件被占用的错误:这时…

linux之用xargs删除这个目录下面后缀为txt的文件(包括子目录)

1问题 删除这个目录下面后缀为txt的文件(包括子目录) 2、xargs命令解决 find . -name "*.txt" | xargs rm -rf3、xargs相关用途 比如在特定的文件里面找到相应的关键字 find . -name "*.txt" | xargs grep word或者 grep -r wor…

软件配置管理(二)配置管理角色与过程

文章目录一、配置管理角色及职责项目经理(PM)配置控制委员会(CCB)配置管理员(CMO)系统集成员(SIO)开发人员(DEV)二、配置管理基本流程计划阶段开发和维护阶段…

JAVA多线程和并发基础面试问答

原文链接 译文连接 作者:Pankaj 译者:郑旭东 校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识…

学习笔记(二)JavaScript基本概念(语法,数据类型,控制语句,函数)

一.语法 1.javascirpt中一切(变量,函数名和操作符)是严格区分大小写的。 2.javascript(标识符) 所谓标识符,就是指变量,函数,属性的名字,或者函数的参数。 命名规则&…

Android悬浮窗口的实现

效果图:(悬浮框可拖动) 在项目开发中有一个需求:弹出悬浮窗后,响应悬浮窗的事件再弹出对话框,但是对话框怎么也不显示。也就是说在弹出悬浮框的同时,不能再弹出对话框,可能的原因&am…

Android之invalid address or address of corrupt block 0xabb494a0 passed to dlfree崩溃解决办法

1、问题 手机崩溃 invalid address or address of corrupt block 0xabb494a0 passed to dlfree Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdeadbaad in tid 29629 (AsyncTask #1) #00 pc 000308a6 /system/lib/libc.so (dlfree1285) 2、原因 const char* 转char *的…

软件配置管理(三)软件配置管理核心功能

文章目录一、CMM/CMMI与软件配置管理产品完整性二、三库管理三、基线管理基线管理的好处基线管理的步骤四、配置库管理五、变更管理变更管理流程六、配置审计七、配置状态报告一、CMM/CMMI与软件配置管理 软件配置管理是CMM/CMMI二级(可重复级)的一个重…

移除指定 global using 命名空间

前言在《.NET 6新特性试用 | 隐式using指令》中&#xff0c;我们介绍过&#xff0c;开启隐式using指令时&#xff0c;会在编译时生成 GlobalUsings.g.cs 文件&#xff0c;加入大量 global using 指令&#xff1a;// <auto-generated/> global using global::Microsoft.As…

Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上

Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上 如今你已经升级或者安装了Ubuntu 14.04&#xff0c; 但是还有另外一件保护你的新系统需要做的事情&#xff1a;备份&#xff01; Ubuntu内置了一个备份工具 Dj Dup Backup Tool。它允许你备份你的系统并保存在本地或者通过…

程序员学好英语的方法(转)

英语对每个人来说都很重要&#xff0c;对于程序员来说尤其的重要&#xff0c;因为一些框架都是外国大佬写的&#xff0c;我们要时时的阅读 API,而这些 API 大多数都是英文了&#xff0c;所以我们程序员对英语的要求还是蛮高的。下面我整理的一些学习英语的方法&#xff0c;分享…

软件配置管理(四)代码味道与重构

文章目录重构的概念及意义代码味道代码味道分类1.类内味道1.1 可度量的味道-Measured Smells1.1.1 过长函数-Long Method1.1.2 过大类-Large Class1.1.3 过长参数列-Long Parameter List1.1.4 过多的注释-Comments1.2 不必要的复杂性-Unnecessary Complexity1.2.1 夸夸其谈的未…