Que peut exactement exécuter SQL Server 2014 en mode batch?

21

Lorsqu'un index columnstore est utilisé dans une requête, SQL Server peut utiliser le mode batch. La documentation est mince sur ce qui peut fonctionner en mode batch et ce qui ne peut pas. Veuillez regarder le plan de requête suivant (motivant) où un nombre surprenant de choses s'exécute en mode batch (vert):

entrez la description de l'image ici

(Il s'agit d'un plan estimé. J'ai utilisé le plan réel pour vérifier que le mode d'exécution réel est bien un traitement par lots.)

Notez que seul le côté génération de T1 utilise un index columnstore. Toutes les entrées de sonde (T2 et T3) sont des magasins en ligne. Leurs données semblent passer en mode batch. J'ai toujours pensé que le mode batch est utilisé pour le flux de données qui ne traverse que le côté sonde.

Il semble que les données puissent passer en mode batch même si elles ne proviennent pas d'un index columnstore. Cela pose la question: pourquoi SQL Server n'utilise-t-il pas également le mode de traitement par lots pour les requêtes en ligne uniquement? Pourrait être bénéfique pour certains d'entre eux. L'utilisation d'un index columnstore est-elle une exigence formelle nécessaire pour que SQL Server considère le mode batch? Pourrions-nous peut-être ajouter une table factice à zéro ligne avec un index columnstore pour induire le mode batch et réaliser des gains de performances?

Qu'est-ce qui peut fonctionner exactement en mode batch à partir de SQL Server 2014?

usr
la source
5
Pourquoi SQL Server n'utilise-t-il pas également le mode batch pour les requêtes en ligne uniquement? Parce que CS ne prend en charge que le mode batch à partir de maintenant. Pourrait être bénéfique pour certains d'entre eux. L'utilisation d'un index columnstore est-elle une exigence formelle nécessaire pour que SQL Server considère le mode batch? Oui CS est une exigence. Il y a un élément de connexion toujours actif Implémenter la prise en charge du mode batch pour Row Store ouvert par Neugebauer.
Kin Shah
2
En 2016, il y a une nouvelle astuce possible pour que le mode batch soit considéré comme BTW sqlmag.com/sql-server/…
Martin Smith

Réponses:

30

Qu'est-ce qui peut fonctionner exactement en mode batch à partir de SQL Server 2014?

SQL Server 2014 ajoute les éléments suivants à la liste d'origine des opérateurs en mode batch:

  • Hash Outer join (y compris la jointure complète)
  • Hash Semi Join
  • Hash Anti Semi Join
  • Union Tout (Concaténation uniquement)
  • Agrégat de hachage scalaire (pas de regroupement)
  • Création de table de hachage par lots supprimée

Il semble que les données puissent passer en mode batch même si elles ne proviennent pas d'un index columnstore.

SQL Server 2012 était très limité dans son utilisation des opérateurs par lots. Les plans en mode batch avaient une forme fixe, s'appuyaient sur des heuristiques et ne pouvaient pas redémarrer le mode batch une fois la transition vers le traitement en mode ligne effectuée.

SQL Server 2014 ajoute le mode d'exécution (batch ou ligne) à la structure de propriétés générales de l'optimiseur de requête, ce qui signifie qu'il peut envisager de passer en mode batch et hors du mode batch à tout moment du plan. Les transitions sont implémentées par des adaptateurs de mode d'exécution invisibles dans le plan. Ces adaptateurs ont un coût qui leur est associé pour limiter le nombre de transitions introduites lors de l'optimisation. Ce nouveau modèle flexible est appelé exécution en mode mixte.

Les adaptateurs de mode d'exécution peuvent être vus dans la sortie de l'optimiseur (mais malheureusement pas dans les plans d'exécution visibles par l'utilisateur) avec TF 8607. non documenté. Par exemple, ce qui suit a été capturé pour une requête comptant des lignes dans un magasin de lignes:

Adaptateurs de ligne à lot à ligne

L'utilisation d'un index columnstore est-elle une exigence formelle nécessaire pour que SQL Server considère le mode batch?

C'est aujourd'hui, oui. Une raison possible de cette restriction est qu'elle limite naturellement le traitement en mode batch à Enterprise Edition.

Pourrions-nous peut-être ajouter une table factice à zéro ligne avec un index columnstore pour induire le mode batch?

Oui, ça marche. J'ai également vu des gens se joindre à plusieurs avec un index columnstore en cluster à une seule ligne pour cette raison. La suggestion que vous avez faite dans les commentaires de joindre à gauche à une table factice columnstore sur false est formidable.

-- 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;

Plan avec jointure externe gauche factice:

Mode batch avec table factice

La documentation est mince

Vrai.

Les meilleures sources officielles d'informations sont les index des colonnes et le réglage des performances de SQL Server .

Le MVP SQL Server Niko Neugebauer a une série formidable sur columnstore en général ici .

Il existe de bons détails techniques sur les modifications de 2014 dans le document de recherche de Microsoft, Améliorations des magasins de colonnes SQL Server (pdf), bien qu'il ne s'agisse pas de la documentation officielle du produit.

Paul White dit GoFundMonica
la source