Exchange Spill (clase de evento)

La clase de evento Exchange Spill indica que los búferes de comunicación de un plan de consulta paralelo se han escrito de forma temporal en la base de datos tempdb. Esto sucede raramente y sólo cuando un plan de consulta tiene múltiples recorridos de intervalo.

Normalmente, la consulta Transact-SQL que genera tales recorridos de intervalo tiene muchos operadores BETWEEN, cada uno de los cuales selecciona un intervalo de filas de una tabla o un índice. Como alternativa, puede obtener múltiples intervalos mediante expresiones como (T.a > 10 AND T.a < 20) OR (T.a > 100 AND T.a < 120). Además, los planes de consulta deben requerir que estos intervalos se recorran en orden, bien porque hay una cláusula ORDER BY en T.a, o bien porque un iterador del plan requiere que éste consuma las tuplas en orden.

Cuando un plan de consulta para una consulta así tiene varios operadores Parallelism, los búferes de comunicación de memoria utilizados por los operadores Parallelism se llenan y puede originarse una situación en la que el progreso de ejecución de la consulta se detenga. En esta situación, uno de los operadores Parallelism escribe su búfer de salida en tempdb (operación llamada volcado de intercambio) por lo que puede consumir filas de algunos de sus búferes de entrada. Es posible que las filas volcadas se devuelvan al consumidor cuando éste esté preparado para consumirlas.

Muy raramente, pueden producirse múltiples volcados de intercambio en un mismo plan de ejecución, lo que haría que la consulta se ejecutara con lentitud. Si advierte más de cinco volcados en la ejecución del mismo plan de consulta, póngase en contacto con su profesional de soporte técnico.

Los volcados de intercambio a veces son transitorios y pueden desaparecer a medida que cambia la distribución de datos.

Hay varias formas de evitar los eventos de volcado de intercambio:

  • Omita la cláusula ORDER BY si no necesita que el conjunto de resultados esté ordenado.

  • Si se requiere ORDER BY, elimine la columna que participa en los múltiples recorridos de intervalo (T.a en el ejemplo anterior) de la cláusula ORDER BY.

  • Mediante una sugerencia de índice, fuerce que el optimizador use una ruta de acceso diferente a la tabla en cuestión.

  • Vuelva a escribir la consulta para generar otro plan de ejecución de consulta.

  • Fuerce la ejecución en serie de la consulta agregando la opción MAXDOP = 1 al final de la consulta o la operación de índice. Para obtener más información, vea max degree of parallelism (opción) y Configurar operaciones de índice en paralelo.

Nota importanteImportante

Para determinar si el evento Exchange Spill se está produciendo cuando el optimizador de consultas genera un plan de ejecución, deberá recopilar también una clase de evento Showplan en la traza. Puede elegir cualquiera de las clases de evento Showplan, excepto Showplan Text y Showplan Text (Unencoded), que no devuelven ningún Id. de nodo. Los Id. de nodo en las clases de evento Showplan identifican cada operación que realiza el optimizador de consultas cuando genera un plan de ejecución de consultas. Estas operaciones se denominan operadores y cada operador de un Showplan tiene un Id. de nodo. La columna ObjectID para los eventos Exchange Spill se corresponde con el Id. de nodo de las clases de evento Showplan para que pueda determinar el operador u operación que produce el error. Para obtener más información acerca de las clases de eventos Showplan, vea Mostrar planes de ejecución mediante las clases de eventos del Analizador de SQL Server.

Columnas de datos de la clase de evento Exchange Spill

Nombre de la columna de datos

Tipo de datos

Descripción

Id. de columna

Filtrable

ApplicationName

nvarchar

Nombre de la aplicación cliente que ha creado la conexión a una instancia de SQL Server. Esta columna se rellena con los valores que pasa la aplicación, en lugar de con el nombre del programa que se muestra.

10

ClientProcessID

int

Identificador que el equipo host asigna al proceso en el que se ejecuta la aplicación cliente. Esta columna de datos se rellena si el cliente proporciona el Id. del proceso del cliente.

9

DatabaseID

int

Id. de la base de datos especificada por la instrucción USE database o la base de datos predeterminada si no se emitió ninguna instrucción USE database para una instancia determinada. El SQL Server Profiler muestra el nombre de la base de datos si se captura la columna de datos ServerName en la traza y el servidor está disponible. El valor para una base de datos se puede determinar mediante la función DB_ID.

3

DatabaseName

nvarchar

Nombre de la base de datos en que se ejecuta la instrucción del usuario.

35

EventClass

int

Tipo de evento = 127.

27

No

EventSequence

int

Secuencia de un determinado evento dentro de la solicitud.

51

No

EventSubClass

int

Tipo de subclase de evento.

1=Principio del volcado

2=Final del volcado

21

GroupID

int

Id. del grupo de carga de trabajo donde se activa el evento de Seguimiento SQL.

66

HostName

nvarchar

Nombre del equipo en el que se está ejecutando el cliente. Esta columna de datos se rellena si el cliente proporciona el nombre del host. Para determinar el nombre del host, utilice la función HOST_NAME.

8

IsSystem

int

Indica si el evento ha ocurrido en un proceso del sistema o en un proceso de usuario. 1 = sistema, 0 = usuario.

60

LoginName

nvarchar

Nombre del inicio de sesión del usuario (inicio de sesión de seguridad de SQL Server o credenciales de inicio de sesión de Windows con el formato <DOMINIO>\<nombreDeUsuario>).

11

LoginSid

image

SID (identificador de seguridad) del usuario que ha iniciado la sesión. Puede encontrar esta información en la tabla syslogins de la base de datos maestra. Cada SID es único para cada inicio de sesión en el servidor.

41

NTDomainName

nvarchar

Dominio de Windows al que pertenece el usuario.

7

NTUserName

nvarchar

Nombre del usuario de Windows.

6

ObjectID

int

Id. del objeto asignado por el sistema. Se corresponde con el Id. de nodo en los eventos Showplan.

22

RequestID

int

Id. de la solicitud que contiene la instrucción.

49

ServerName

nvarchar

Nombre de la instancia de SQL Server de la que se realiza un seguimiento.

26

No

SessionLoginName

nvarchar

Nombre de inicio de sesión del usuario que originó la sesión. Por ejemplo, si se conecta a SQL Server usando inicioDeSesión1 y ejecuta una instrucción como inicioDeSesión2, SessionLoginName muestra inicioDeSesión1 y LoginName muestra inicioDeSesión2. En esta columna se muestran los inicios de sesión de SQL Server y de Windows.

64

SPID

int

Id. de la sesión en la que se produjo el evento.

12

StartTime

datetime

Hora a la que se inició el evento, si está disponible.

14

TransactionID

bigint

Id. de la transacción asignado por el sistema.

4

XactSequence

bigint

Símbolo (token) que describe la transacción actual.

50