SQL Server Table Spool优化

本文详细介绍了SQL Server中Table Spool操作符,包括其作用、类型以及在执行计划中的表现。通过一个案例展示了如何优化涉及Spool的操作,强调不能仅依赖单一指标评估优化效果,提倡先尝试改写SQL语句,再考虑调整索引。最后,提醒读者在面对Spool时,应具体情况具体分析。
摘要由CSDN通过智能技术生成

本系列属于 SQL Server性能优化案例分享 专题



    在执行计划中出现的Spool操作符,往往都具有明显的性能问题,也意味着数据库的设计、编码等可能存在问题,所以本文专门介绍一下这个操作符。


   

Spool介绍

    Spool是内存或者磁盘上的缓存(cache)或临时表。SQL Server用这个结构来提升在执行过程中需要多次执行的复杂的子表达式的性能。注意几个次:一次运行中多次执行、复杂的子表达式。其目的是为了提升性能。

    比如下面的一个演示语句,使用TempDB来创建一个测试表:

USE TempDB
GO
CREATE TABLE dbo.Orders (
	OrderID INT NOT NULL
	,CustomerId INT NOT NULL
	,Total MONEY NOT NULL
	,CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED (OrderID)
	)
GO
;WITH N1 (C)AS (
	SELECT 0	
	UNION ALL	
	SELECT 0
	) -- 2 行
,N2 (C)AS (
	SELECT 0
	FROM N1 AS T1 CROSS JOIN N1 AS T2
	) -- 4 行
,N3 (C) AS (
	SELECT 0
	FROM N2 AS T1
	CROSS JOIN N2 AS T2
	) -- 16 行
,N4 (C)AS (
	SELECT 0
	FROM N3 AS T1
	CROSS JOIN N3 AS T2
	) -- 256 行
,Nums (Num)
AS (
	SELECT row_number() OVER ( ORDER BY ( SELECT NULL ) )
	FROM N4
	)
INSERT INTO dbo.Orders (OrderId ,CustomerId ,Total )
SELECT Num,Num % 10 + 1 ,Num
FROM Nums;

    然后打开实际执行并运行下面查询,返回订单信息及每个客户的总销售额。

USE TempDB
GO
select OrderId, CustomerID, Total
,Sum(Total) over(partition by CustomerID) as [Total Customer Sales] 
from dbo.Orders

    可以看到如下结果:


    在图中可以看到,SQL Server对Order 表进行了扫描,并且基于CustomerID进行排序。然后使用Table Spool对结果进行缓存。使得后续操作(比如计算总数)中可以直接访问这些缓存数据,同时由于缓存值已经排序,可以避免二次排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值