Exchange 溢出事件类

Exchange Spill 事件类指示并行查询计划中通信缓冲区已临时写入 tempdb 数据库。 这种情况很少发生,并且仅在查询计划具有多个范围扫描时发生。

通常,生成此类范围扫描的 Transact-SQL 查询具有许多 BETWEEN 运算符,每个运算符从表或索引中选择一系列行。 或者,可以使用表达式(T.a 10 AND T.a >< 20)或(T.a > 100 AND T.a < 120)获取多个范围。 此外,查询计划必须要求按顺序扫描这些范围,因为 T.a 上存在 ORDER BY 子句,或者计划内的迭代器要求按排序顺序使用元组。

当此类查询的查询计划具有多个 并行 运算符时, 并行 运算符使用的内存通信缓冲区就已满,并且可能会出现查询的执行进度停止的情况。 在这种情况下,并行运算符之一将其输出缓冲区写入tempdb中(这一操作称为交换溢出),以便它可以消耗某些输入缓冲区中的行。 最终,当使用者准备好使用这些行时,溢出的行将返回到使用者。

极少数情况下,多个交换溢出可能发生在同一执行计划中,导致查询执行缓慢。 如果在同一查询计划的执行中注意到超过 5 个溢出,请联系支持专业人员。

Exchange 溢出有时是暂时性的,在数据分布发生变化时可能会消失。

有多种方法可以避免交换溢出事件:

  • 如果不需要对结果集进行排序,则省略 ORDER BY 子句。

  • 如果需要 ORDER BY,请从 ORDER BY 子句中消除参与多个范围扫描的列(上述示例中的 T.a)。

  • 使用索引提示,强制优化器对有关表使用不同的访问路径。

  • 重写查询以生成不同的查询执行计划。

  • 通过将 MAXDOP = 1 选项添加到查询或索引操作的末尾来强制串行执行查询。 有关详细信息,请参阅 配置最大并行度服务器配置选项配置并行索引作

重要

若要确定查询优化器生成执行计划时 Exchange Spill 事件发生的位置,还应在跟踪中收集 Showplan 事件类。 可以选择除 Showplan TextShowplan Text (Unencoded) 事件类之外的任何 Showplan 事件类(不返回节点 ID)。 Showplan 中的节点 ID 用于标识查询优化器在生成查询执行计划时执行的每个操作。 这些作称为运算符,Showplan 中的每个运算符都有一个节点 ID。 Exchange Spill 事件的 ObjectID 列对应于 Showplans 中的节点 ID,以便可以确定哪个运算符或作会导致错误。

Exchange Spill 事件类别数据列

数据列名称 数据类型 DESCRIPTION 列 ID 可筛选
ApplicationName nvarchar 创建到 SQL Server 实例连接的客户端应用程序的名称。 此列由应用程序传递的值填充,而不是由所显示的程序名填充。 10 是的
ClientProcessID int 主机为运行该客户端应用程序的进程分配的 ID。 如果客户端提供了客户端进程 ID,则填充此数据列。 9 是的
DatabaseID int 由 USE database 语句指定的数据库的 ID;如果未对给定实例发出 USE database 语句,则为默认数据库的 ID。 如果在跟踪中捕获 ServerName 数据列且服务器可用,SQL Server Profiler 将显示数据库名称。 可使用 DB_ID 函数来确定数据库的值。 3 是的
数据库名称 nvarchar 正在其中运行用户语句的数据库的名称。 35 是的
EventClass int 事件类型 = 127。 二十七
EventSequence int 给定事件在请求中的顺序。 51
EventSubClass int 事件子类的类型。

1=溢出开始

2=溢出结束
21 是的
GroupID int 在其中激发 SQL 跟踪事件的工作负荷组的 ID。 66 是的
HostName nvarchar 正在运行客户端的计算机的名称。 如果客户端提供了主机名,则填充此数据列。 若要确定主机名,请使用 HOST_NAME 函数。 8 是的
IsSystem int 指示事件是发生在系统进程中还是发生在用户进程中。 1 = 系统,0 = 用户。 六十 是的
LoginName nvarchar 用户的登录名(SQL Server 安全登录名或域<\>用户名<形式的> Windows 登录凭据)。 11 是的
LoginSid 图像 登录用户的安全标识号 (SID)。 可以在 master 数据库的 syslogins 表中找到此信息。 服务器中的每个登录名都具有唯一的 SID。 41 是的
NTDomainName nvarchar 用户所属的 Windows 域。 7 是的
NTUserName nvarchar Windows 用户名。 6 是的
ObjectID int 系统分配的对象 ID。 对应于 Showplans 中的节点 ID。 22 是的
RequestID int 包含该语句的请求的 ID。 49 是的
ServerName nvarchar 要跟踪的 SQL Server 实例的名称。 26
SessionLoginName nvarchar 发起会话的用户的登录名。 例如,如果使用 Login1 连接到 SQL Server,并将语句作为 Login2 执行,SessionLoginName 将显示 Login1,LoginName 显示 Login2。 此列同时显示 SQL Server 和 Windows 登录名。 64 是的
SPID int 该事件发生的会话 ID。 12 是的
StartTime 日期/时间 该事件(如果存在)的启动时间。 14 是的
TransactionID bigint 系统分配的事务 ID。 4 是的
XactSequence bigint 用于说明当前事务的标记。 50 是的

另请参阅

sp_trace_setevent(Transact-SQL)
设置索引选项
ALTER INDEX (Transact-SQL)