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