Cosa può eseguire esattamente SQL Server 2014 in modalità batch?


21

Quando un indice columnstore viene utilizzato in una query, SQL Server è in grado di utilizzare la modalità batch. La documentazione è sottile su cosa può essere eseguito in modalità batch e cosa no. Si prega di guardare il seguente piano di query (motivante) in cui viene eseguito un numero sorprendente di cose in modalità batch (verde):

inserisci qui la descrizione dell'immagine

(Questo è un piano stimato. Ho usato il piano effettivo per verificare che la modalità di esecuzione effettiva sia effettivamente batch.)

Si noti che solo il lato build di T1 utilizza un indice columnstore. Tutti gli ingressi sonda (T2 e T3) sono file di righe. I loro dati sembrano passare alla modalità batch. Ho sempre pensato che la modalità batch fosse utilizzata per il flusso di dati che attraversa solo il lato della sonda.

Sembra che i dati possano passare alla modalità batch anche se non provengono da un indice columnstore. Ciò pone la domanda: perché SQL Server non utilizza la modalità batch anche per le query solo per il rowstore? Potrebbe essere utile per alcuni di loro. L'uso di un indice columnstore è un requisito formale necessario per fare in modo che SQL Server consideri la modalità batch? Potremmo forse aggiungere una tabella fittizia a zero righe con un indice columnstore per indurre la modalità batch e realizzare guadagni in termini di prestazioni?

Cosa può essere eseguito esattamente in modalità batch da SQL Server 2014?


5
Perché SQL Server non utilizza la modalità batch anche per le query solo rowstore? Perché CS supporta solo la modalità batch al momento. Potrebbe essere utile per alcuni di loro. L'uso di un indice columnstore è un requisito formale necessario per fare in modo che SQL Server consideri la modalità batch? Sì CS è un requisito. È ancora attivo un elemento di connessione Attiva supporto modalità batch per Row Store aperto da Neugebauer.
Kin Shah,

2
Nel 2016 c'è un nuovo possibile trucco per prendere in considerazione la modalità batch BTW sqlmag.com/sql-server/…
Martin Smith

Risposte:


30

Cosa può essere eseguito esattamente in modalità batch da SQL Server 2014?

SQL Server 2014 aggiunge quanto segue all'elenco originale di operatori in modalità batch:

  • Hash Outer join (incluso full join)
  • Hash Semi Join
  • Hash Anti Semi Join
  • Union All (solo concatenazione)
  • Hash aggregato scalare (nessun gruppo per)
  • Creazione della tabella hash batch rimossa

Sembra che i dati possano passare alla modalità batch anche se non provengono da un indice columnstore.

SQL Server 2012 era molto limitato nell'uso di operatori batch. I piani in modalità batch avevano una forma fissa, si basavano sull'euristica e non potevano riavviare la modalità batch una volta effettuata la transizione all'elaborazione in modalità riga.

SQL Server 2014 aggiunge la modalità di esecuzione (batch o riga) al framework delle proprietà generali di Query Optimizer, il che significa che può prendere in considerazione la transizione da e verso la modalità batch in qualsiasi punto del piano. Le transizioni sono implementate da adattatori di modalità di esecuzione invisibili nel piano. A questi adattatori è associato un costo per limitare il numero di transizioni introdotte durante l'ottimizzazione. Questo nuovo modello flessibile è noto come modalità mista.

Gli adattatori della modalità di esecuzione sono visibili nell'output dell'ottimizzatore (sebbene purtroppo non nei piani di esecuzione visibili all'utente) con TF 8607 non documentato. Ad esempio, è stata acquisita una query per il conteggio delle righe in un archivio di righe:

Adattatori Row to Batch to Row

L'uso di un indice columnstore è un requisito formale necessario per fare in modo che SQL Server consideri la modalità batch?

È oggi sì. Una possibile ragione di questa limitazione è che limita naturalmente l'elaborazione in modalità batch a Enterprise Edition.

Potremmo forse aggiungere una tabella fittizia a zero righe con un indice columnstore per indurre la modalità batch?

Sì, funziona. Ho visto anche persone incrociate con un indice columnstore cluster a riga singola proprio per questo motivo. Il suggerimento che hai fatto nei commenti di sinistra per unirsi a una tabella fittizia columnstore su false è eccezionale.

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

Pianificare con join esterno sinistro fittizio:

Modalità batch con tabella fittizia

La documentazione è scarsa

Vero.

Le migliori fonti ufficiali di informazioni sono gli indici di Columnstore descritti e l' ottimizzazione delle prestazioni di Columnstore di SQL Server .

MVP di SQL Server Niko Neugebauer ha una serie formidabile su columnstore in generale qui .

Ci sono alcuni buoni dettagli tecnici sulle modifiche del 2014 nel documento di Microsoft Research, Enhancements to SQL Server Column Stores (pdf) sebbene questa non sia una documentazione ufficiale del prodotto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.