¿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:
¿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:
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.