Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La clase de eventos Exchange Spill indica que los búferes de comunicación de un plan de consulta paralelo se han escrito temporalmente en la base de datos tempdb . Esto ocurre con poca frecuencia y solo cuando un plan de consulta tiene varios escaneos de rango.
Normalmente, la consulta Transact-SQL que genera dichos análisis 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 examinen en orden, ya sea porque hay una cláusula ORDER BY en T.a, o porque un iterador dentro del plan requiere que consuma las tuplas en orden ordenado.
Cuando un plan de consulta para esta consulta tiene varios operadores de paralelismo , los búferes de comunicación de memoria utilizados por los operadores de paralelismo se llenan y puede surgir una situación en la que el progreso de la ejecución de la consulta se detiene. En esta situación, uno de los operadores de paralelismo escribe su búfer de salida en tempdb (una operación denominada desbordamiento de intercambio) para que pueda consumir filas de algunos de sus búferes de entrada. Finalmente, las filas derramadas se devuelven al consumidor cuando el consumidor está listo para consumirlas.
Muy rara vez, se pueden producir varios desbordamientos de intercambio en el mismo plan de ejecución, lo que hace que la consulta se ejecute lentamente. Si observa más de cinco derrames dentro de la misma ejecución del plan de consulta, póngase en contacto con su profesional de soporte técnico.
A veces, los derrames de intercambio son transitorios y pueden desaparecer a medida que cambian las distribuciones de datos.
Hay varias maneras de evitar eventos de desbordamiento de intercambio:
Omita la cláusula ORDER BY si no necesita que se ordene el conjunto de resultados.
Si se requiere ORDER BY, elimine la columna que participa en los escaneos de múltiples rangos (T.a en el ejemplo anterior) de la cláusula ORDER BY.
Con una sugerencia de índice, obligue al optimizador a usar una ruta de acceso diferente en la tabla en cuestión.
Vuelva a escribir la consulta para generar un plan de ejecución de consultas diferente.
Forzar la ejecución en serie de la consulta agregando la opción MAXDOP = 1 al final de la operación de consulta o índice. Para obtener más información, vea Configure the max degree of parallelism Server Configuration Option (Configurar la opción de configuración del servidor grado máximo de paralelismo) y Configure Parallel Index Operations (Configurar operaciones de índice paralelo).
Importante
Para determinar dónde se produce el evento Exchange Spill cuando el optimizador de consultas genera un plan de ejecución, debe recopilar también una clase de evento de Showplan en el seguimiento. Puede elegir cualquiera de las clases de eventos Showplan excepto las clases de eventos Showplan Text y Showplan Text (Sin codificar), que no devuelven un identificador de nodo. Los identificadores de nodo de 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 un plan de presentación tiene un identificador de nodo. La columna ObjectID para los eventos Exchange Spill corresponde al identificador de nodo en los planos de presentación para que puedas determinar qué operador o operación está causando el error.
Columnas de datos de la clase de eventos Exchange Spill
| Nombre de columna de datos | Tipo de dato | 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 | 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 identificador de proceso del cliente. | 9 | Sí |
| 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 | Sí |
| DatabaseName | nvarchar | Nombre de la base de datos en la que se ejecuta la instrucción del usuario. | 35 | Sí |
| 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=Inicio del derrame 2=Fin del derrame |
Veintiuno | Sí |
| GroupID | Int | Id. del grupo de carga de trabajo donde se activa el evento de Seguimiento de SQL. | 66 | Sí |
| Nombre de host | 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 | 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 las credenciales de inicio de sesión de Windows en forma de <DOMINIO>\<nombredeusuario>). | 11 | Sí |
| LoginSid | imagen | 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 | Sí |
| NTDomainName | nvarchar | Dominio de Windows al que pertenece el usuario. | 7 | Sí |
| NTUserName | nvarchar | Nombre del usuario de Windows. | 6 | Sí |
| ObjectID | Int | Identificador del objeto asignado por el sistema. Corresponde con el identificador de nodo en Plan de presentación. | 22 | Sí |
| SolicitudID | Int | Identificador de la solicitud que contiene la instrucción. | 49 | Sí |
| 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 | Sí |
| SPID | Int | Identificador 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 | Token que describe la transacción actual. | 50 | Sí |
Véase también
sp_trace_setevent (Transact-SQL)
Establecer opciones de índice
ALTER INDEX (Transact-SQL)