Solución de problemas de errores tempdb en un grupo de SQL dedicado
Se aplica a: Azure Synapse Analytics
En un grupo de SQL dedicado, la base de datos tempdb se usa para tablas temporales y espacio intermedio para los movimientos de datos (por ejemplo: movimientos aleatorios, movimientos de recorte), ordenaciones, cargas, desbordamientos de memoria y otras operaciones. Además, una transacción no confirmada en una sesión que interactúa con la base de datos tempdb impedirá que el registro vacíe todas las demás sesiones, lo que hará que los archivos de registro se rellenen. Dado que la base de datos tempdb es un recurso compartido, un gran consumo del espacio tempdb puede provocar un error en las consultas de otros usuarios y puede escalar para evitar que se establezcan nuevas conexiones.
¿Qué hacer si no puedo conectarme al grupo de SQL dedicado?
Si no tiene conexiones existentes para identificar conexiones o consultas problemáticas, el único método para resolver la incapacidad de crear una nueva conexión es pausar y reanudar o escalar el grupo de SQL dedicado. Esta acción finalizará las transacciones de usuario que llevaron a este problema y volverá a crear la base de datos tempdb cuando se reinicie el servicio.
Nota: Asegúrese de proporcionar al servicio tiempo adicional para deshacer todas las transacciones en ejecución, ya que las operaciones de pausa y escalado pueden tardar más de lo normal en completarse en este escenario.
Solución de problemas de archivos de datos de tempdb completos
Paso 1: Identificar la consulta que rellena la base de datos tempdb
Asegúrese de identificar la consulta que rellena la base de datos tempdb mientras se ejecuta la consulta, a menos que haya implementado un componente de registro en el marco de ETL o la auditoría de las instrucciones del grupo de SQL dedicado. En la mayoría de los casos, no siempre, la consulta de ejecución más larga ejecutada durante el período de tiempo en el que se produjo el problema es la causa de los errores de espacio insuficiente de tempdb. Ejecute la consulta siguiente para obtener una lista de consultas de ejecución prolongada:
SELECT TOP 5 *
FROM sys.dm_pdw_exec_requests
WHERE status = 'running'
ORDER BY total_elapsed_time desc;
Una vez que tenga una consulta razonablemente sospechosa, pruebe una de las siguientes opciones:
- Elimine la instrucción .
- Intente evitar que cualquier otra carga de trabajo consuma aún más el espacio tempdb para que el ejecutor largo pueda completarse.
Paso 2: Impedir la periodicidad
Después de identificar y tomar medidas en la consulta responsable, considere la posibilidad de implementar mitigaciones para evitar que el problema se repita. En la tabla siguiente se muestran mitigaciones para las causas más comunes de errores completos de tempdb:
Causa | Description | Mitigación |
---|---|---|
Plan distribuido deficiente | El plan distribuido generado para una consulta determinada puede introducir accidentalmente un movimiento de datos de alta frecuencia como resultado de estadísticas de tabla con un mantenimiento deficiente. | Actualice las estadísticas de las tablas pertinentes y asegúrese de que se mantienen según una programación regular. |
Estado deficiente del índice de almacén de columnas (CCI) agrupado | Consume el espacio tempdb debido a los desbordamientos de memoria. | Recompile los CCIs y asegúrese de que se mantienen según una programación regular. |
Transacciones de gran tamaño | Un gran volumen de instrucciones o INSERT SELECT rellena tempdb durante las operaciones de movimiento de CREATE TABLE AS SELECT (CTAS) datos. |
Divida la instrucción CTAS o INSERT SELECT en varias transacciones más pequeñas. |
Asignación de memoria insuficiente | Las consultas con memoria insuficiente asignada (a través de la clase de recursos o el grupo de cargas de trabajo) pueden desbordarse en tempdb . |
Ejecute las consultas con una clase de recurso mayor o un grupo de cargas de trabajo con más recursos. |
Consultas de tabla externa del usuario final | Las consultas en tablas externas no son óptimas para las consultas del usuario final porque el motor debe leer todo el archivo en tempdb antes de procesar los datos. |
Cargue los datos en una tabla permanente y, a continuación, dirija allí las consultas de usuario. |
Recursos generales insuficientes | Es posible que encuentre que el grupo de SQL dedicado está cerca de su capacidad máxima de tempdb durante una actividad alta. | Considere la posibilidad de escalar verticalmente el grupo de SQL dedicado en combinación con cualquiera de las mitigaciones anteriores. |
Solución de problemas de archivos completos de registro de transacciones de tempdb
El registro de transacciones de tempdb normalmente solo se rellena cuando un cliente o usuario:
- Abre una transacción explícita, pero nunca emite o
COMMIT
ROLLBACK
. - Establece
IMPLICIT_TRANSACTION = ON
(especialmente para clientes y herramientas de JDBC que usan características de AutoCommit).
Paso 1: Identificación de transacciones abiertas
Las conexiones problemáticas pueden ser de los clientes que tienen una transacción abierta, pero están en estado "Inactivo". Ejecute la consulta siguiente para ayudar a identificar este escenario:
SELECT *
FROM sys.dm_pdw_exec_sessions
WHERE is_transactional = 1
AND status = 'Idle';
Nota: No todas las conexiones que se devuelven como resultado de esta consulta son necesariamente problemáticas. Ejecute la consulta al menos dos veces con más de 15 minutos entre ejecuciones y vea qué conexiones persisten en este estado.
Paso 2: Mitigar y evitar el problema
Después de identificar qué clientes contienen transacciones abiertas, trabaje con los usuarios para cambiar o ambos:
- Configuración del controlador (por ejemplo: configuración de AutoCommit de JDBC en
off
, que estableceIMPLICIT_TRANSACTIONS = ON
) - Comportamientos de consulta ad hoc (por ejemplo: ejecución
BEGIN TRAN
incorrecta sin/COMMIT
ROLLBACK
)
Como alternativa, puede considerar la posibilidad de crear un proceso automatizado para detectar periódicamente este escenario y eliminar las sesiones potencialmente problemáticas.
Recursos
- Consulte sys.dm_pdw_errors de DMV en busca de errores.