Hash Warning 이벤트 클래스Hash Warning Event Class

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse Hash Warning 이벤트 클래스는 해시 연산 중 해시 재귀 또는 해시 중단(해시 재귀 한도 초과) 발생을 모니터링하는 데 사용할 수 있습니다. The Hash Warning event class can be used to monitor when a hash recursion or cessation of hashing (hash bailout) has occurred during a hashing operation.

해시 재귀는 빌드 입력이 사용할 수 있는 메모리를 초과하여 여러 개의 파티션으로 분할되어 개별적으로 처리되는 경우 발생합니다.Hash recursion occurs when the build input does not fit into available memory, resulting in the split of input into multiple partitions that are processed separately. 분할된 파티션 중 여전히 사용할 수 있는 메모리를 초과하는 파티션이 있으면 이는 다시 하위 파티션으로 분할되어 개별적으로 처리됩니다.If any of these partitions still do not fit into available memory, it is split into subpartitions, which are also processed separately. 이러한 분할 프로세스는 각 파티션이 사용할 수 있는 메모리에 모두 맞거나 최대 재귀 수준에 도달할 때까지 계속됩니다(IntegerData 데이터 열에 표시됨).This splitting process continues until each partition fits into available memory or until the maximum recursion level is reached (displayed in the IntegerData data column).

해시 연산이 최대 재귀 수준에 도달하면 해시 재귀 한도 초과가 발생하며 대체 계획으로 변경하여 남은 파티션 데이터를 처리합니다.Hash bailout occurs when a hashing operation reaches its maximum recursion level and shifts to an alternate plan to process the remaining partitioned data. 해시 재귀 한도 초과는 보통 일치하지 않는 데이터로 인해 발생합니다.Hash bailout usually occurs because of skewed data.

해시 재귀 및 해시 재귀 한도 초과는 서버 성능을 저하시킵니다.Hash recursion and hash bailout cause reduced performance in your server. 해시 재귀 및 해시 재귀 한도 초과를 제거하거나 빈도를 낮추려면 다음 중 하나를 실행하십시오.To eliminate or reduce the frequency of hash recursion and bailouts, do one of the following:

  • 조인 또는 그룹화된 열에 통계가 있는지 확인합니다.Make sure that statistics exist on the columns that are being joined or grouped.

  • 열에 통계가 있으면 업데이트합니다.If statistics exist on the columns, update them.

  • 다른 형식의 조인을 사용합니다.Use a different type of join. 예를 들어 MERGE 또는 LOOP 조인을 대신 사용합니다(가능한 경우).For example, use a MERGE or LOOP join instead, if appropriate.

  • 컴퓨터에서 사용할 수 있는 메모리를 늘립니다.Increase available memory on the computer. 해시 재귀 또는 해시 재귀 한도 초과는 쿼리를 적시에 처리할 메모리가 부족하여 디스크에 써야하는 경우 발생합니다.Hash recursion or bailout occurs when there is not enough memory to process queries in place and they need to spill to disk.

    해시 재귀 또는 해시 재귀 한도 초과가 발생하는 수를 줄이는 가장 효과적인 방법은 조인과 관련된 열의 통계를 만들거나 업데이트하는 것입니다.Creating or updating the statistics on the column involved in the join is the most effective way to reduce the number of hash recursion or bailouts that occur.

참고

유예 해시 조인재귀 해시 조인 도 해시 재귀 한도 초과와 관련이 있는 용어입니다.The terms grace hash join and recursive hash join are also used to describe hash bailout.

중요

쿼리 최적화 프로그램이 실행 계획을 생성할 때 Hash Warning 이벤트가 발생하는 위치를 확인하려면 추적에서 Showplan 이벤트 클래스도 수집해야 합니다.To determine where the Hash Warning event is occurring when the query optimizer generates an execution plan, you should also collect a Showplan event class in the trace. 노드 ID를 반환하지 않는 Showplan Text 및 Showplan Text (Unencoded) 이벤트 클래스를 제외한 모든 Showplan 이벤트 클래스를 선택할 수 있습니다.You can choose any of the Showplan event classes except the Showplan Text and Showplan Text (Unencoded) event classes, which do not return a Node ID. 실행 계획의 노드 ID는 쿼리 최적화 프로그램이 쿼리 실행 계획을 생성할 때 수행하는 각 연산을 식별합니다.Node IDs in Showplans identify each operation the query optimizer performs when it generates a query execution plan. 이러한 연산을 연산자라고 하며 실행 계획의 각 연산자에는 노드 ID가 있습니다.These operations are called operators, and each operator in a Showplan has a Node ID. Hash Warning 이벤트의 ObjectID 열은 실행 계획의 노드 ID에 해당하므로 오류가 발생하는 연산자, 즉 연산을 확인할 수 있습니다.The ObjectID column for Hash Warning events corresponds to the Node ID in Showplans so you can determine which operator, or operation, is causing the error.

Hash Warning 이벤트 클래스 데이터 열Hash Warning Event Class Data Columns

데이터 열 이름Data column name 데이터 형식Data type 설명Description 열 IDColumn ID 필터 가능Filterable
ApplicationNameApplicationName nvarcharnvarchar SQL ServerSQL Server인스턴스에 연결한 클라이언트 응용 프로그램의 이름입니다.Name of the client application that created the connection to an instance of SQL ServerSQL Server. 이 열은 프로그램의 표시 이름이 아니라 응용 프로그램에서 전달한 값으로 채워집니다.This column is populated with the values passed by the application rather than with the displayed name of the program. 1010 Yes
ClientProcessIDClientProcessID intint 클라이언트 응용 프로그램이 실행 중인 프로세스에 대해 호스트 컴퓨터가 할당한 ID입니다.ID assigned by the host computer to the process where the client application is running. 클라이언트가 클라이언트 프로세스 ID를 제공하면 이 데이터 열이 채워집니다.This data column is populated if the client provides a client process ID. 99 Yes
DatabaseIDDatabaseID intint USE database 문에서 지정한 데이터베이스 ID이거나, 지정한 인스턴스에 대해 USE database 문을 실행하지 않은 경우 기본 데이터베이스입니다.ID of the database specified by the USE database statement or the default database if no USE database statement has been issued for a given instance. SQL Server 프로파일러SQL Server Profiler 에 ServerName 데이터 열이 추적에서 캡처되고 서버를 사용할 수 있으면 데이터베이스 이름이 표시됩니다. displays the name of the database if the ServerName data column is captured in the trace and the server is available. DB_ID 함수를 사용하여 데이터베이스의 값을 확인할 수 있습니다.Determine the value for a database by using the DB_ID function. 33 Yes
DatabaseNameDatabaseName nvarcharnvarchar 사용자 문이 실행되는 데이터베이스의 이름입니다.Name of the database in which the user statement is running. 3535 Yes
EventClassEventClass intint 이벤트 유형 = 55Type of event = 55. 2727 아니요No
EventSequenceEventSequence intint 요청 내에 지정된 이벤트 시퀀스입니다.Sequence of a given event within the request. 5151 아니요No
EventSubClassEventSubClass intint 이벤트 하위 클래스의 유형입니다.Type of event subclass.

0=재귀0=Recursion

1=한도 초과1=Bailout
2121 Yes
GroupIDGroupID intint SQL 추적 이벤트가 발생한 작업 그룹의 ID입니다.ID of the workload group where the SQL Trace event fires. 6666 Yes
HostNameHostName nvarcharnvarchar 클라이언트를 실행 중인 컴퓨터 이름입니다.Name of the computer on which the client is running. 클라이언트가 호스트 이름을 제공할 경우 이 데이터 열이 채워집니다.This data column is populated if the client provides the host name. 호스트 이름을 확인하려면 HOST_NAME 함수를 사용합니다.To determine the host name, use the HOST_NAME function. 88 Yes
IntegerDataIntegerData intint 재귀 수준입니다(해시 재귀만 해당).Recursion level (hash recursion only). 2525 Yes
IsSystemIsSystem intint 이벤트가 시스템 프로세스에서 발생했는지 아니면 사용자 프로세스에서 발생했는지를 나타냅니다.Indicates whether the event occurred on a system process or a user process. 1 = 시스템, 0 = 사용자1 = system, 0 = user. 6060 Yes
LoginNameLoginName nvarcharnvarchar 사용자 로그인 이름(<DOMAIN>\<username> 형식의 Windows 로그인 자격 증명 또는 SQL ServerSQL Server 보안 로그인)입니다.Name of the login of the user (either SQL ServerSQL Server security login or the Windows login credentials in the form of <DOMAIN>\<username>). 1111 Yes
LoginSidLoginSid imageimage 로그인한 사용자의 SID(보안 ID)입니다.Security identification number (SID) of the logged-in user. 이 정보는 sys.server_principals 카탈로그 뷰에 있습니다.You can find this information in the sys.server_principals catalog view. 각 SID는 서버의 각 로그인마다 고유합니다.Each SID is unique for each login in the server. 4141 Yes
NTDomainNameNTDomainName nvarcharnvarchar 사용자가 속한 Windows 도메인입니다.Windows domain to which the user belongs. 77 Yes
NTUserNameNTUserName nvarcharnvarchar Windows 사용자 이름입니다.Windows user name. 66 Yes
ObjectIDObjectID intint 재분할에 관련된 해시 팀의 루트 노드 ID입니다.Node ID of the root of the hash team involved in the repartition. 실행 계획의 노드 ID와 일치합니다.Corresponds with the Node ID in Showplans. 2222 Yes
RequestIDRequestID intint 문을 포함하는 요청의 ID입니다.ID of the request that contains the statement. 4949 Yes
데이터 열이 추적에서 캡처되고 서버를 사용할 수 있으면ServerName nvarcharnvarchar 추적 중인 SQL ServerSQL Server 인스턴스의 이름입니다.Name of the instance of SQL ServerSQL Server that is being traced. 2626
SessionLoginNameSessionLoginName nvarcharnvarchar 세션을 시작한 사용자의 로그인 이름입니다.Login name of the user who originated the session. 예를 들어 Login1을 사용하여 SQL ServerSQL Server 에 연결하고 Login2로 문을 실행할 경우 SessionLoginName은 Login1을 표시하고 LoginName은 Login2를 표시합니다.For example, if you connect to SQL ServerSQL Server using Login1 and execute a statement as Login2, SessionLoginName shows Login1 and LoginName shows Login2. 이 열은 SQL ServerSQL Server 및 Windows 로그인을 모두 표시합니다.This column displays both SQL ServerSQL Server and Windows logins. 6464 Yes
SPIDSPID intint 이벤트가 발생한 세션의 ID입니다.ID of the session on which the event occurred. 1212 Yes
StartTimeStartTime datetimedatetime 이벤트가 시작된 시간입니다(사용 가능한 경우).Time at which the event started, if available. 1414 Yes
TransactionIDTransactionID bigintbigint 시스템이 할당한 트랜잭션의 ID입니다.System-assigned ID of the transaction. 44 Yes
XactSequenceXactSequence bigintbigint 현재 트랜잭션을 설명하는 토큰입니다.Token that describes the current transaction. 5050 Yes

참고 항목See Also

sp_trace_setevent(Transact-SQL)sp_trace_setevent (Transact-SQL)