《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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

Android悬浮窗口的实现

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

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

文章目录一、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。它允许你备份你的系统并保存在本地或者通过…

【C#/.NET 日常开发技巧】JWT+ActionFilter 简便控制器代码

微信公众号&#xff1a;趣编程ACE关注可了解更多.NET日常开发技巧&#xff0c;如需源码&#xff0c;请公众号留言 源码;JWTActionFilter 简便控制器代码这是微软关于过滤器的介绍&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?viewaspne…

在P2P市场中代替“看不见的手”的算法在哪里

◆ ◆ ◆ 本文简单探讨P2P市场机制&#xff0c;在此基础上探讨匹配撮合服务的可能性。 ◆ ◆ ◆ P2P市场机制基本定义与假设 首先&#xff0c;我们回顾一些基本定义与假设。P2P市场为“网络借贷是指个体和个体之间通过互联网平台实现的直接借贷。”[2]利率决定一般是平台决定借…

关于他们回答的 怎样在桌面建一个python GUI的快捷方式 这个问题

在之前的2个随笔里面&#xff0c;有写过《找到可以解决问题的正确的人》、《如何提问》&#xff0c;说白了就是您需要帮助的时候&#xff0c;您得让对方100%懂你&#xff0c;否则没戏。 那么最近看到这样1个古老的问题&#xff0c;和一些没有答到"点儿"上的回答&…

.NET Core中行为过滤器ActionFilterAttribute的使用介绍

什么是行为过滤器&#xff1f;行为过滤器是你可以应用到一个控制器行为的&#xff0c;或者整个控制器的&#xff0c;来修改控制器行为的执行方式的属性。当请求进入 API 接口的时候&#xff0c;操作过滤器提供了一个进入之前&#xff08;before&#xff09;和进入之后&#xff…

基本线程同步(三)在同步的类里安排独立属性

声明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第二章&#xff0c;作者&#xff1a; Javier Fernndez Gonzlez 译者&#xff1a;许巧辉 校对&#xff1a;方腾飞 在同步的类里安排独立属性 当你使用synchronized关键字来保护代码块时&#xff0c;你必须通过一…

软件项目组织管理(一)项目管理概述

文章目录什么是项目项目的特征项目的组成要素&#xff08;三维约束&#xff09;什么是项目管理什么是IT项目什么是软件项目管理项目管理的目标&#xff08;项目成功的标志&#xff09;软件项目失败的原因活动的3个基本特点人类活动分为两种类型作业和项目的区别&#xff08;必考…

ABP Framework 5.2 RC 版本发布及新增功能介绍

本文将介绍 ABP Framework 5.2 RC 版新增的主要功能&#xff1a;•单层解决方案模板•API 版本控制•源代码控制移除libs文件夹•对 Swagger UI 隐藏 ABP 默认端点•CMS Kit应用模块自定义全局 CSS 和 JavaScript关注 ABP Framework 最新开发进度&#xff0c;后面还会陆续发布新…

《计算机组成原理》----2.3 二进制运算

本节书摘来自华章出版社《计算机组成原理》一书中的第2章&#xff0c;第2.3节&#xff0c; 作 者 Computer Organization and Architecture: Themes and Variations&#xff3b;英&#xff3d;艾伦克莱门茨&#xff08;Alan Clements&#xff09; 著&#xff0c;沈 立 王苏峰…

JTable常见用法细则

JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一.创建表格控件的各种方式:1) 调用无参构造函数. JTable table new JTable();2) 以表头和表数据创建表格. Object[][] cellData {{"row1-col1", "row1-col…

下拉刷新:继承listView控件

1、首先初始化的时候给控件监听OnScrollListener&#xff0c;其中onScroll的参数里得到第一个显示的条目&#xff0c;当第一个条目为0的时候就可以执行下啦刷新了。第二覆写的方法是 onScrollStateChanged就是滑动状态的监听&#xff0c;3种状态都是常量&#xff1a;快速滑动&a…

软件项目组织管理(二、三)项目管理与信息技术环境、项目管理过程组

文章目录系统方法系统管理三维模型组织环境组织的四个框架组织的结构项目生命周期管理评审虚拟团队什么是过程项目管理过程组系统方法 项目管理工作需要采取系统的方法&#xff0c;描述在解决复杂问题时所需的整体性和分析性方法。 系统哲学&#xff1a;将事情作为系统考虑的…