SQL Server 存储中间结果集
在SQL Server中执行查询时,有一些操作会产生中间结果集,例如:排序操作,Hash Join和Hash Aggregate操作产生的Hash Table,游标等,SQL Server查询优化器使用 Worktable 和 Workfile 存储中间结果集,对中间结果集执行后续操作,以响应用户的请求。
一,Spool 操作符
Spool的中文解释是假脱机,是指两个设备处于联机状态,只不过都在后台运行。
假脱机的原理,通俗的说,是在两个设备之间进行数据交换,一个设备传输数据的速度快,一个设备传输数据的速度慢。为了充分利用高速设备,在需要交换数据时,低速设备将数据输入到缓冲区,同时,高速设备无需等待低速设备,而是径直去处理其他Task,等低速设备将全部数据输入到缓存之后,高速设备再去缓冲区读取数据,然后快速处理,这样高速设备就不会闲置,提高设备的利用率。Spool 为了协调两个设备,需要用到一个缓冲区,低速设备向缓冲区中写数据,高速设备从缓冲区中读取数据。所以,假脱机技术的原理,是低速设备在后台利用缓冲区转存数据,高速设备从缓冲区获取数据,执行数据处理。
在 SQL Server的执行计划中,Spool 是逻辑运算符,分为Eager Spool 和 Lazy Spool:
- Eager Spool 逻辑运算符:一次性将所有数据输入到临时的Spool中
- Lazy Spool 逻辑运算符:逐批将数据输入到临时的Spool中
如果执行计划出现这两个操作符,表明 SQL Server 需要将中间结果集保存到临时存储区,在SQL Server中,临时存储区是指Worktable 或 Workfile, 用于存储临时结果集:
- WorkFile: 用于存储Hash Join 和 Hash 聚合的临时结果集,小的临时结果集存储在Memory中;
- WorkTable: 用于存储 Query Spool(table spool, index spool, and so on),Lob 变量,XML变量和游标的临时结果集;
- Spill to tempdb:WorkFile和WorkTable都创建在内存中,如果临时结果集太大,分配的Memory容纳不了,那么,临时结果集会被保存到tempdb file中,即:spill to disk(tempdb files);
- 查询性能降低:一般来说,SQL Server在执行计划中使用WorkFile 或 WorkTable,表明查询语句的性能较低
引用MSDN:
"Work files could be used to store temporary results for hash joins and hash aggregates. The returned value should be less than 20. Tempdb work files are used in processing hash operations when the amount of data being processed is too large to fit into the available memory." Possible problems: High values can indicate thrash in the tempdb file as well as poorly coded queries.
"Work tables could be used to store temporary results for query spool, lob variables, XML variables, and cursors. The returned value should be less than 20. Worktables are used for queries that use various spools (table spool, index spool, and so on)." Possible problems: High values could cause general slowdown.
二,查看Workfile 和 Worktable
查询优化器创建Workfile 和 Worktable 的目的是为了存储临时结果集,在执行查询时,设置 “Set Statistics IO On” ,能够看到查询语句创建的 Workfile 和 Worktable,以及临时存储区的IO信息,如图:
一般情况下,如果临时存储对象(Workfile 和 Worktable)被创建,说明查询的中间结果集太大,服务器的内存资源将被耗尽,导致SQL Server 必须使用Disk存储中间结果集,才能使查询操作继续执行,但是,可用的内存耗尽和额外的IO开销,都会降低SQL Server的的查询性能。
SQL Server在内存中创建Workfile 和 Worktable,在中间结果集较小时,中间结果集保存在内存中;如果结果集过大,保存在内存将增加内存压力,SQL Server将中间结果集转存到tempdb的数据文件中,即,从内存写入到Disk。在需要中间结果集时,从Disk File读取到内存中,产生额外的Disk IO,降低SQL Server的查询性能。
1,使用Worktable
关系引擎在执行 order by、group by或者union操作时,需要创建WorkTable,用于保存中间结果集。例如,在执行Order by 操作时,如果没有在排序字段上创建index,那么SQL Server查询优化器会在tempdb中创建一个WorkTable来缓存中间查询结果集,并对中间结果集进行排序。在系统需要时,自动创建创建在tempdb中创建WorkTable;当系统不再需要该WorkTable时,会自动从tempdb中删除。
优化方法:为了减少WorkTable的使用,应该优化SQL语句,减少不必要的group by,order by或Union操作,在select 子句中剔去不必要的column,使返回的结果集尽可能的小。
引用MSDN:
The relational engine may need to build a worktable to perform a logical operation specified in an SQL statement. Worktables are internal tables that are used to hold intermediate results. Worktables are generated for certain GROUP BY, ORDER BY, or UNION queries. For example, if an ORDER BY clause references columns that are not covered by any indexes, the relational engine may need to generate a worktable to sort the result set into the order requested. Worktables are also sometimes used as spools that temporarily hold the result of executing a part of a query plan. Worktables are built in tempdb and are dropped automatically when they are no longer needed.
2,使用WorkFile
在SQL Server执行Hash Join 或 Hash聚合操作,使用WorkFiles来存储临时结果集。
Hash Join 能够有效处理大量,未排序,未索引的输入;Hash Join在处理复杂查询返回的中间结果集时非常有用,是因为:
Intermediate results are not indexed (unless explicitly saved to disk and then indexed) and often are not suitably sorted for the next operation in the query plan.
Query optimizers estimate only intermediate result sizes. Because estimates can be very inaccurate for complex queries, algorithms to process intermediate results not only must be efficient, but also must degrade gracefully if an intermediate result turns out to be much larger than anticipated.
优化方法:为了减少WorkFile的使用,在和大表进行Join查询时,尽可能地使用Index Column,避免对无序数据进行Hash Join或Hash 聚合操作。
参考文档:
Operator of the Week – Spools, Eager Spool
SET STATISTICS IO- worktable/workfile
Beware misleading data from SET STATISTICS IO
Simple Query tuning with STATISTICS IO and Execution plans
Advanced Query Tuning Concepts
SQL Server, Access Methods Object
workfiles created/sec spiking out of control
SQL Server 存储中间结果集的更多相关文章
- SQL Server故障转移集群
在XenServer集群上给客户搭建一个应用服务,要求有负载均衡,Web服务器用Windows Server 2008 R2 + IIS,数据库Sql Server 2008 R2,并且使用SAN存储 ...
- SQL SERVER存储引擎——04.数据
4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...
- SQL Server存储ntext截断问题
SQL Server存储ntext截断问题 最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...
- SQL Server 2012 AlwaysOn集群配置指南
1. AlwaysOn介绍 AlwaysOn是SQL Server 2012提供的全新综合.灵活.高效经济的高可用性和灾难恢复解决方案.它整合了镜像和群集的功能,基于OS 故障转移群集(Windows ...
- SQL Server 存储(1/8):理解数据页结构
我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...
- SQL Server 存储(3/8):理解GAM和SGAM页
我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据.GAM(Global Al ...
- SQL Server 存储(5/8):理解IAM 页
在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. 在SQL Server 2005和以后的版本 ...
- SQL Server 存储引擎-剖析Forwarded Records
我们都知道数据在存储引擎中是以页的形式组织的,但数据页在不同的组织形式中其中对应的数据行存储是不尽相同的,这里通过实例为大家介绍下堆表的中特有的一种情形Forwared Records及处理方式. 概 ...
- SQL Server 存储(2/8):理解数据记录结构
在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在 ...
随机推荐
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- ABP文档 - Mvc 视图
文档目录 本节内容: 简介 AbpWebViewPage 基类 简介 ABP通过nuget包Abp.Web.Mvc集成到Mvc视图里,你可以像往常那样创建常规的视图. AbpWebViewPage 基 ...
- nodejs进阶(5)—接收请求参数
1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- EntityFramework Core 1.1是如何创建DbContext实例的呢?
前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...
- 关于 CSS 反射倒影的研究思考
原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...
- ASP.NET MVC5----常见的数据注解和验证
只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...
- ASP.NET MVC一次删除多笔记录
批量删除数据记录,如下面的截屏: 先选中想删除的记录,然后点一下删除铵钮,系统将把选中的记录一次性删除.在此,Insus.NET不想每删除一笔记录连接一次数据库. 因此需要把选择的记录一次上传至服务器 ...
- Atitit.attilax软件研发与项目管理之道
Atitit.attilax软件研发与项目管理之道 1. 前言4 2. 鸣谢4 3. Genesis 创世记4 4. 软件发展史4 5. 箴言4 6. 使徒行传 4 7. attilax书 4 8. ...
- css实现文本框和下拉框结合的案例
html 代码部分 <div id="list-name-input" class="list-name-input"> <select ty ...