¿Qué puede ejecutar SQL Server 2014 exactamente en modo por lotes?

21

Cuando se utiliza un índice de almacén de columnas en una consulta, SQL Server puede usar el modo por lotes. La documentación es escasa sobre qué se puede ejecutar en modo por lotes y qué no. Observe el siguiente plan de consulta (motivador) donde se ejecuta una cantidad sorprendente de cosas en modo por lotes (verde):

ingrese la descripción de la imagen aquí

(Este es un plan estimado. Utilicé el plan real para verificar que el modo de ejecución real sea realmente por lotes).

Tenga en cuenta que solo el lado de compilación de T1 utiliza un índice de almacén de columnas. Todas las entradas de sonda (T2 y T3) son almacenes de filas. Sus datos parecen pasar al modo por lotes. Siempre pensé que el modo por lotes se está utilizando para el flujo de datos que se ejecuta solo en el lado de la sonda.

Parece que los datos pueden pasar al modo por lotes incluso si no se originan a partir de un índice de almacén de columnas. Eso plantea la pregunta: ¿por qué SQL Server no usa el modo por lotes para consultas solo de almacén de filas también? Podría ser beneficioso para algunos de ellos. ¿Usar un índice de almacén de columnas es un requisito formal que es necesario para que SQL Server considere el modo por lotes? ¿Podríamos agregar una tabla ficticia de fila cero con un índice de almacén de columnas para inducir el modo por lotes y obtener ganancias de rendimiento?

¿Qué se puede ejecutar exactamente en modo por lotes a partir de SQL Server 2014?

usr
fuente
55
¿Por qué SQL Server no usa también el modo por lotes para consultas solo de almacén de filas? Porque CS solo admite el modo por lotes a partir de ahora. Podría ser beneficioso para algunos de ellos. ¿Usar un índice de almacén de columnas es un requisito formal que es necesario para que SQL Server considere el modo por lotes? Sí CS es un requisito. Hay un elemento de conexión aún activo. Implementar el soporte del modo de lote para el almacén de filas abierto por Neugebauer.
Kin Shah
2
En 2016 hay un nuevo truco posible para obtener el modo por lotes considerado BTW sqlmag.com/sql-server/…
Martin Smith

Respuestas:

30

¿Qué se puede ejecutar exactamente en modo por lotes a partir de SQL Server 2014?

SQL Server 2014 agrega lo siguiente a la lista original de operadores de modo por lotes:

  • Unión externa de hash (incluida la combinación completa)
  • Hash Semi Join
  • Hash Anti Semi Join
  • Union All (solo concatenación)
  • Agregado de hash escalar (sin grupo por)
  • Se eliminó la compilación de tabla hash de lote

Parece que los datos pueden pasar al modo por lotes incluso si no se originan a partir de un índice de almacén de columnas.

SQL Server 2012 fue muy limitado en su uso de operadores por lotes. Los planes de modo por lotes tenían una forma fija, dependían de la heurística y no podían reiniciar el modo por lotes una vez que se había realizado una transición al procesamiento en modo de fila.

SQL Server 2014 agrega el modo de ejecución (lote o fila) al marco de propiedad general del optimizador de consultas, lo que significa que puede considerar la transición al modo por lotes en cualquier punto del plan. Las transiciones se implementan mediante adaptadores de modo de ejecución invisible en el plan. Estos adaptadores tienen un costo asociado con ellos para limitar el número de transiciones introducidas durante la optimización. Este nuevo modelo flexible se conoce como Ejecución en modo mixto.

Los adaptadores del modo de ejecución se pueden ver en la salida del optimizador (aunque lamentablemente no en los planes de ejecución visibles para el usuario) con el TF 8607 no documentado. Por ejemplo, se capturó lo siguiente para una consulta contando filas en un almacén de filas:

Adaptadores de fila a lote a fila

¿Usar un índice de almacén de columnas es un requisito formal que es necesario para que SQL Server considere el modo por lotes?

Es hoy, sí. Una posible razón de esta restricción es que, naturalmente, restringe el procesamiento en modo por lotes a Enterprise Edition.

¿Podríamos agregar una tabla ficticia de fila cero con un índice de almacén de columnas para inducir el modo por lotes?

Si, esto funciona. También he visto personas que se cruzan con un índice de almacén de columnas agrupado de una sola fila solo por esta razón. La sugerencia que hizo en los comentarios para unirse a una tabla ficticia de almacén de columnas en falso es excelente.

-- Demo the technique (no performance advantage in this case)
--
-- Row mode everywhere
SELECT COUNT_BIG(*) FROM dbo.FactOnlineSales AS FOS;
GO
-- Dummy columnstore table
CREATE TABLE dbo.Dummy (c1 int NULL);
CREATE CLUSTERED COLUMNSTORE INDEX c ON dbo.Dummy;
GO
-- Batch mode for the partial aggregate
SELECT COUNT_BIG(*) 
FROM dbo.FactOnlineSales AS FOS
LEFT OUTER JOIN dbo.Dummy AS D ON 0 = 1;

Planifique con la unión externa izquierda ficticia:

Modo por lotes con mesa ficticia

La documentación es escasa

Cierto.

Las mejores fuentes oficiales de información son los índices de almacén de columnas descritos y el ajuste de rendimiento del almacén de columnas de SQL Server .

El MVP de SQL Server, Niko Neugebauer, tiene una excelente serie de columnas en general aquí .

Hay algunos buenos detalles técnicos sobre los cambios de 2014 en el documento de investigación de Microsoft, Mejoras en las tiendas de columnas de SQL Server (pdf), aunque esta no es documentación oficial del producto.

Paul White dice GoFundMonica
fuente