Exchange Spill 이벤트 클래스
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
Exchange Spill 이벤트 클래스는 병렬 쿼리 계획의 통신 버퍼가 tempdb 데이터베이스에 임시적으로 기록되었음을 나타냅니다. 이는 매우 드물게 발생하며 쿼리 계획에 다중 범위 검색이 있는 경우에만 발생합니다.
일반적으로 이러한 범위 검색을 생성하는 Transact-SQL 쿼리에는 많은 BETWEEN 연산자가 있으며, 각 연산자는 테이블 또는 인덱스에서 행 범위를 선택합니다. 또는 (T.a 10 AND T.a 20) OR(T.a > 100 AND T.a < > < 120)과 같은 식을 사용하여 여러 범위를 가져올 수 있습니다. 또한 쿼리 계획은 T.a에 ORDER BY 절이 있거나 계획 내의 반복기가 정렬된 순서로 튜플을 사용해야 하기 때문에 이러한 범위를 순서대로 검색해야 합니다.
이러한 쿼리에 대한 쿼리 계획에 여러 병렬 처리 연산자가 있는 경우 병렬 처리 연산자가 사용하는 메모리 통신 버퍼가 가득 차서 쿼리 실행 진행이 중지되는 상황이 발생할 수 있습니다. 이 경우 병렬 처리 연산자 중 하나는 일부 입력 버퍼의 행을 사용할 수 있도록 출력 버퍼를 tempdb(교환 유출이라고 하는 작업)에 씁니다. 결국 소비자가 이러한 행을 사용할 준비가 되면 기록된 행이 소비자에게 반환됩니다.
매우 드물게 동일한 실행 계획 내에서 여러 교환 유출이 발생하여 쿼리가 느리게 실행될 수 있습니다. 동일한 쿼리 계획의 실행 내에서 5개가 넘는 유출이 발견되면 지원 전문가에게 문의하세요.
Exchange spill은 임시적인 경우가 있으며 데이터 분산이 변경되면 사라질 수 있습니다.
교환 유출 이벤트를 방지하는 방법에는 여러 가지가 있습니다.
결과 집합을 정렬할 필요가 없는 경우 ORDER BY 절을 생략합니다.
ORDER BY가 필요한 경우 ORDER BY 절에서 여러 범위 검사에 참여하는 열(위 예제의 T.a)을 제거합니다.
인덱스 힌트를 사용하여 최적화 프로그램에서 해당 테이블에서 다른 액세스 경로를 사용하도록 합니다.
쿼리를 다시 작성하여 다른 쿼리 실행 계획을 생성합니다.
쿼리 또는 인덱스 작업의 끝에 MAXDOP = 1 옵션을 추가하여 쿼리의 직렬 실행을 강제로 수행합니다. 자세한 내용은 최대 병렬 처리 수준 서버 구성 옵션 구성 및 병렬 인덱스 작업 구성을 참조하세요.
Important
쿼리 최적화 프로그램에서 실행 계획을 생성할 때 Exchange Spill 이벤트가 발생하는 위치를 확인하려면 추적에서 Showplan 이벤트 클래스도 수집해야 합니다. 노드 ID를 반환하지 않는 Showplan Text 및 Showplan Text(인코딩되지 않은) 이벤트 클래스를 제외한 모든 Showplan 이벤트 클래스를 선택할 수 있습니다. 실행 계획의 노드 ID는 쿼리 최적화 프로그램이 쿼리 실행 계획을 생성할 때 수행하는 각 연산을 식별합니다. 이러한 작업을 연산자라고 하며 Showplan의 각 연산자에는 노드 ID가 있습니다. Exchange Spill 이벤트에 대한 ObjectID 열은 실행 계획에서 노드 ID에 해당하므로 오류를 일으키는 연산자 또는 작업을 확인할 수 있습니다.
Exchange Spill 이벤트 클래스 데이터 열
데이터 열 이름 | 데이터 형식 | Description | 열 ID | 필터 가능 |
---|---|---|---|---|
ApplicationName | nvarchar | SQL Server 인스턴스에 대한 연결을 만든 클라이언트 애플리케이션의 이름입니다. 이 열은 표시된 프로그램 이름이 아닌 애플리케이션에서 전달되는 값으로 채워집니다. | 10 | 예 |
ClientProcessID | int | 호스트 컴퓨터에서 클라이언트 애플리케이션이 실행 중인 프로세스에 할당된 ID입니다. 클라이언트가 클라이언트 프로세스 ID를 제공하는 경우 이 데이터 열이 채워집니다. | 9 | 예 |
DatabaseID | int | 지정된 인스턴스에 대해 USE 데이터베이스 문이 실행되지 않은 경우 USE 데이터베이스 문 또는 기본 데이터베이스에 지정된 데이터베이스의 ID입니다. SQL Server Profiler는 ServerName 데이터 열이 추적에 캡처되고 서버를 사용할 수 있는 경우 데이터베이스의 이름을 표시합니다. DB_ID 함수를 사용하여 데이터베이스의 값을 결정합니다. | 3 | 예 |
DatabaseName | nvarchar | 사용자 문이 실행 중인 데이터베이스의 이름입니다. | 35 | 예 |
EventClass | int | 이벤트 유형 = 127. | 27 | 아니요 |
EventSequence | int | 요청 내에 지정된 이벤트 시퀀스입니다. | 51 | 아니요 |
EventSubClass | int | 이벤트 하위 클래스의 유형입니다. 1=유출 시작 2=유출 끝 |
21 | 예 |
GroupID | int | SQL Trace 이벤트가 발생하는 워크로드 그룹의 ID입니다. | 66 | 예 |
HostName | nvarchar | 클라이언트가 실행 중인 컴퓨터의 이름입니다. 클라이언트에서 호스트 이름을 제공하는 경우 이 데이터 열이 채워집니다. 호스트 이름을 확인하려면 HOST_NAME 함수를 사용합니다. | 8 | 예 |
IsSystem | int | 시스템 프로세스 또는 사용자 프로세스에서 이벤트가 발생했는지 여부를 나타냅니다. 1 = system, 0 = user. | 60 | 예 |
LoginName | nvarchar | 사용자의 로그인 이름(SQL Server 보안 로그인 또는 DOMAIN>\username> 형식의 <Windows 로그인 자격 증명<). | 11 | 예 |
LoginSid | image | 로그인한 사용자의 SID(보안 ID 번호)입니다. 이 정보는 master 데이터베이스의 syslogins 테이블에서 찾을 수 있습니다. 각 SID는 서버의 각 로그인에 대해 고유합니다. | 41 | 예 |
NTDomainName | nvarchar | 사용자가 속한 Windows 도메인입니다. | 7 | 예 |
NTUserName | nvarchar | Windows 사용자 이름입니다. | 6 | 예 |
ObjectID | int | 개체의 시스템 할당 ID입니다. 실행 계획에서 노드 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 | 예 |
StartTime | 날짜/시간 | 이벤트가 시작된 시간(사용 가능한 경우)입니다. | 14 | 예 |
TransactionID | bigint | 트랜잭션의 시스템 할당 ID입니다. | 4 | 예 |
XactSequence | bigint | 현재 트랜잭션을 설명하는 토큰입니다. | 50 | 예 |
참고 항목
sp_trace_setevent(Transact-SQL)
인덱스 옵션 설정
ALTER INDEX(Transact-SQL)