Compartir vía


Exchange Spill, clase de eventos

Se aplica a: SQL ServerAzure SQL Database Azure SQL Instancia administrada

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 solo cuando un plan de consulta tiene múltiples recorridos de intervalo.

Normalmente, la consulta transact-SQL que genera estos exámenes 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 varios 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 Establecer la opción de configuración del servidor Grado máximo de paralelismo y Configurar operaciones de índice en paralelo.

Importante

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 el seguimiento. Puede elegir cualquiera de las clases de eventos Showplan, excepto Showplan Text y Showplan Text (Unencoded) , que no devuelven ningún identificador de nodo. Los identificadores de nodo en las clases de evento Showplans 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 Showplan tiene un identificador de nodo. La columna ObjectID de los eventos Exchange Spill se corresponden con el identificador de nodo de las clases de eventos Showplan para que pueda determinar qué operador u operación está provocando el error.

Columnas de datos de la clase de evento Exchange Spill

Nombre de columna de datos Tipo de datos Descripción Identificador de columna Filtrable
ApplicationName nvarchar Nombre de la aplicación cliente que creó 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 que se muestra para el programa. 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 identificador de proceso del cliente. 9
DatabaseID int Identificador de la base de datos especificada mediante la instrucción USE database o la base de datos predeterminada si no se emite la instrucción USE database para una determinada instancia. SQL Server Profiler muestra el nombre de la base de datos si se captura la columna de datos ServerName en el seguimiento y el servidor está disponible. Determina el valor de una base de datos mediante la función DB_ID. 3
DatabaseName nvarchar Nombre de la base de datos en la que se ejecuta la instrucción del usuario. 35
EventClass int Tipo de evento = 127. 27 No
EventSequence int Secuencia de un evento determinado de la solicitud. 51 No
EventSubClass int Tipo de la subclase de eventos.

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 de 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 averiguar el nombre de host, use 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 las credenciales de inicio de sesión de Windows en forma de DOMINIO\nombredeusuario>).<>< 11
LoginSid image SID (número de identificación 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 Identificador del objeto asignado por el sistema. Se corresponde con el Id. de nodo en los eventos Showplan. 22
IdSolicitud int Identificador de la solicitud que contiene la instrucción. 49
ServerName nvarchar Nombre de la instancia de SQL Server que se realiza el 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 mediante Login1 y ejecuta una instrucción como Login2, SessionLoginName muestra Login1 y LoginName muestra Login2. En esta columna se muestran los inicios de sesión de SQL Server y Windows. 64
SPID int Identificador 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 Token que describe la transacción actual. 50

Consulte también

sp_trace_setevent (Transact-SQL)
Establecer opciones de índice
ALTER INDEX (Transact-SQL)