哈希警告事件类可用于监视哈希运算期间发生哈希递归或哈希中止(哈希退出)的情况。
当生成输入不适合可用内存时,会发生哈希递归,从而导致将输入拆分为单独处理的多个分区。 如果其中任何分区仍不适合可用内存,则会将其拆分为子分区,这些分区也会单独处理。 此拆分过程一直持续到每个分区都适合可用内存或达到最大递归级别(显示在 IntegerData 数据列中)。
当哈希操作达到最大递归级别时,会转向备用方案以处理剩余的分区数据,这时就会发生哈希回退。 哈希救助通常因数据倾斜而发生。
哈希递归和哈希失败恢复会导致服务器性能降低。 若要消除或减少哈希递归和回退的频率,请执行以下操作之一:
确保联接或分组的列上存在统计信息。
如果列上存在统计信息,请更新它们。
使用不同类型的联接。 例如,如果适合,请改用 MERGE 或 LOOP 连接。
增加计算机上的可用内存。 当内存不足时,无法就地处理查询并需要溢出到磁盘,就会发生哈希递归或回退。
创建或更新加入中涉及的列的统计信息是减少发生的哈希递归或异常处理次数的最有效方法。
注释
术语 宽限哈希联接 和 递归哈希联接 也用于描述哈希救助。
重要
若要确定查询优化器生成执行计划时发生哈希警告事件的位置,还应在跟踪中收集 Showplan 事件类。 可以选择除 Showplan Text 和 Showplan Text (Unencoded) 事件类之外的任何 Showplan 事件类(不返回节点 ID)。 Showplan 中的节点 ID 用于标识查询优化器在生成查询执行计划时执行的每个操作。 这些作称为 运算符,Showplan 中的每个运算符都有一个节点 ID。 哈希警告事件的 ObjectID 列对应于 Showplans 中的节点 ID,以便可以确定哪个运算符或作会导致错误。
哈希警告事件类数据列
| 数据列名称 | 数据类型 | DESCRIPTION | 列 ID | 可筛选 |
|---|---|---|---|---|
| 应用程序名称 | nvarchar |
创建到 SQL Server 实例连接的客户端应用程序的名称。 此列使用应用程序传递的值而不是程序显示的名称填充。 | 10 | 是的 |
| ClientProcessID | int |
主机为运行该客户端应用程序的进程分配的 ID。 如果客户端提供客户端进程 ID,则填充此数据列。 | 9 | 是的 |
| 数据库ID | int |
由 USE database 语句指定的数据库的 ID;如果未对给定实例发出 USE database 语句,则为默认数据库的 ID。 如果在跟踪中捕获 ServerName 数据列且服务器可用,SQL Server Profiler 将显示数据库名称。 可使用 DB_ID 函数来确定数据库的值。 | 3 | 是的 |
| 数据库名称 | nvarchar |
正在其中运行用户语句的数据库的名称。 | 35 | 是的 |
| EventClass | int |
事件类型 = 55。 | 二十七 | 否 |
| 事件序列 | int |
给定事件在请求中的顺序。 | 51 | 否 |
| 事件子类 | int |
事件子类的类型。 0=递归 1=财务纾困 |
21 | 是的 |
| 群组ID | int |
在其中激发 SQL 跟踪事件的工作负荷组的 ID。 | 66 | 是的 |
| 主机名称 | nvarchar |
正在运行客户端的计算机的名称。 如果客户端提供了主机名,则填充此数据列。 若要确定主机名,请使用 HOST_NAME 函数。 | 8 | 是的 |
| 整数数据 | int |
递归级别(仅哈希递归)。 | 二十五 | 是的 |
| IsSystem | int |
指示事件是发生在系统进程中还是发生在用户进程中。 1 = 系统,0 = 用户。 | 六十 | 是的 |
| 登录名 | nvarchar |
用户的登录名(SQL Server 安全登录名或域>\<用户名>形式的< Windows 登录凭据)。 | 11 | 是的 |
| LoginSid | image |
登录用户的安全标识号 (SID)。 您可以在 sys.server_principals 目录视图中找到此信息。 服务器中的每个登录名都具有唯一的 SID。 | 41 | 是的 |
| NT域名名称 | nvarchar |
用户所属的 Windows 域。 | 7 | 是的 |
| NT用户名 (NTUserName) | nvarchar |
Windows 用户名。 | 6 | 是的 |
| ObjectID(对象标识符) | int |
重新分区中涉及的哈希组根节点的节点 ID。 对应于 Showplans 中的节点 ID。 | 22 | 是的 |
| RequestID | int |
包含语句的请求的 ID。 | 49 | 是的 |
| 服务器名称 | nvarchar |
正在跟踪的 SQL Server 实例的名称。 | 26 | |
| SessionLoginName | nvarchar |
发起会话的用户的登录名。 例如,如果使用 Login1 连接到 SQL Server,并将语句作为 Login2 执行,SessionLoginName 将显示 Login1,LoginName 显示 Login2。 此列同时显示 SQL Server 和 Windows 登录名。 | 64 | 是的 |
| 意大利公共数字身份系统 (SPID) | int |
该事件发生的会话 ID。 | 12 | 是的 |
| 开始时间 | datetime |
该事件(如果存在)的启动时间。 | 14 | 是的 |
| TransactionID | bigint |
系统分配的事务 ID。 | 4 | 是的 |
| XactSequence | bigint |
用于说明当前事务的标记。 | 50 | 是的 |