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.
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 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 |
Sí |
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 |
Sí |
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 |
Sí |
DatabaseName |
nvarchar |
Nombre de la base de datos en que se ejecuta la instrucción del usuario. |
35 |
Sí |
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 |
Sí |
GroupID |
int |
Id. del grupo de carga de trabajo donde se activa el evento de Seguimiento SQL. |
66 |
Sí |
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 |
Sí |
IsSystem |
int |
Indica si el evento ha ocurrido en un proceso del sistema o en un proceso de usuario. 1 = sistema, 0 = usuario. |
60 |
Sí |
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 |
Sí |
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 |
Sí |
NTDomainName |
nvarchar |
Dominio de Windows al que pertenece el usuario. |
7 |
Sí |
NTUserName |
nvarchar |
Nombre del usuario de Windows. |
6 |
Sí |
ObjectID |
int |
Id. del objeto asignado por el sistema. Se corresponde con el Id. de nodo en los eventos Showplan. |
22 |
Sí |
RequestID |
int |
Id. de la solicitud que contiene la instrucción. |
49 |
Sí |
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 |
Sí |
SPID |
int |
Id. de la sesión en la que se produjo el evento. |
12 |
Sí |
StartTime |
datetime |
Hora a la que se inició el evento, si está disponible. |
14 |
Sí |
TransactionID |
bigint |
Id. de la transacción asignado por el sistema. |
4 |
Sí |
XactSequence |
bigint |
Símbolo (token) que describe la transacción actual. |
50 |
Sí |
Vea también