Ottimizzazione delle prestazioni di esecuzione delle query del data warehouse tramite l'applicazione di filtri bitmap

La maggior parte delle query del data warehouse sono progettate per seguire uno schema star e possono elaborare centinaia di milioni di righe in una sola query. Per impostazione predefinita, Query Optimizer rileva le query in base agli schemi star e crea piani di query efficienti. Un metodo che può essere sfruttato da Query Optimizer per generare un piano efficiente è quello di applicare i filtri bitmap. Un filtro bitmap utilizza una rappresentazione compatta di un set di valori da una tabella in una parte dell'albero dell'operatore per filtrare le righe da una seconda tabella in un'altra parte dell'albero. Essenzialmente, il filtro esegue una riduzione semi join; ovvero, vengono elaborate solo le righe nella seconda tabella risultanti per il join nella prima tabella.

In SQL Server 2008, l'applicazione del filtro bitmap può essere introdotta nel piano di query dopo l'ottimizzazione, come in SQL Server 2005, oppure introdotta dinamicamente da Query Optimizer durante la generazione del piano di query. Quando il filtro è introdotto dinamicamente, viene denominato filtro bitmap ottimizzato. L'applicazione di filtri bitmap ottimizzati può migliorare significativamente le prestazioni delle query del data warehouse che utilizzano gli schemi star rimuovendo dalla tabella dei fatti le righe non risultanti all'inizio del piano di query. Senza l'applicazione di filtri bitmap ottimizzati, tutte le righe nella tabella dei fatti sono elaborate tramite una parte dell'albero dell'operatore prima che l'operazione di join con le tabelle della dimensione rimuova le righe non risultanti. Con l'applicazione dei filtri bitmap, le righe non risultanti nella tabella dei fatti sono immediatamente eliminate.

L'applicazione di filtri bitmap ottimizzati è disponibile solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server

Informazioni sull'applicazione dei filtri bitmap

Il filtro bitmap presenta dei vantaggi rispetto all'indice bitmap. Un indice bitmap è un modo alternativo per rappresentare elenchi di ID di riga (RID) in un indice con un elenco di valori utilizzando uno o più vettori che indicano quale riga in una tabella contiene un certo valore della colonna. Entrambi possono essere molto efficaci nel rimuovere righe non necessarie dall'elaborazione risultante; vi sono tuttavia differenze significative tra un filtro bitmap e un indice bitmap. Innanzitutto, i filtri bitmap sono strutture in memoria, ciò elimina qualsiasi overhead per la manutenzione dell'indice dovuto a operazioni di DML (Data Manipulation Language) effettuate nella tabella sottostante. Inoltre, i filtri bitmap sono molto piccoli e, a differenza degli indici su disco esistenti che in genere dipendono dalle dimensioni della tabella sulla quale sono basati, i filtri bitmap possono essere creati dinamicamente con un impatto minimo sui tempi di elaborazione della query.

Confronto tra l'applicazione di filtri bitmap e l'applicazione di filtri bitmap ottimizzati

L'applicazione di filtri bitmap e l'applicazione di filtri bitmap ottimizzati sono implementate nel piano di query utilizzando l' operatore showplan bitmap. L'applicazione di filtri bitmap viene effettuata solamente nei piani di query paralleli nei quali sono utilizzati hash join o merge join. L'applicazione di filtri bitmap ottimizzati può essere utilizzata solamente nei piani di query paralleli nei quali sono utilizzati hash join. In entrambi i casi, il filtro bitmap viene compilato sul lato dell'input di creazione (la tabella delle dimensioni) di un hash join; tuttavia la vera e propria applicazione dei filtri in genere viene effettuata all'interno dell'operatore Parallelism che si trova sul lato dell'input probe (la tabella dei fatti) dell'hash join. Quando il join è basato su una colonna integer, il filtro può essere applicato direttamente alla tabella iniziale o all'operazione di analisi dell'indice invece che all'operatore Parallelism. Questa tecnica è chiamata ottimizzazione all'interno delle righe.

Quando l'applicazione del filtro bitmap viene introdotta nel piano di query dopo l'ottimizzazione, il tempo di compilazione della query si riduce; tuttavia, i piani di query di cui può tenere conto Query Optimizer sono limitati e le stime della cardinalità e del costo non sono prese in considerazione.

I filtri bitmap ottimizzati presentano i seguenti vantaggi:

  • È supportata l'applicazione di filtri da più tabelle delle dimensioni.

  • È possibile applicare più filtri a un singolo operatore.

  • I filtri bitmap ottimizzati possono essere applicati a più tipi di operatore. Tra questi vi sono gli operatori di scambio, ad esempio gli operatori Distribute Streams e Repartition Streams, gli operatori Table o Index Scan e gli operatori di filtro.

  • L'applicazione dei filtri può essere utilizzata con le istruzioni SELECT e gli operatori di sola lettura utilizzati nelle istruzioni INSERT, UPDATE, DELETE e MERGE.

  • L'applicazione dei filtri può essere utilizzata per la creazione di viste indicizzate negli operatori utilizzati per popolare l'indice.

  • Query Optimizer utilizza le stime della cardinalità e del costo per determinare se l'applicazione di filtri bitmap ottimizzati è adatta.

  • Query Optimizer può tenere conto di più piani.

Come viene implementata l'applicazione di filtri bitmap ottimizzati

Un filtro bitmap è utile solo se è selettivo. Query Optimizer determina quando un filtro bitmap ottimizzato è sufficientemente selettivo per essere utile e a quali operatori il filtro viene applicato. Query Optimizer posiziona i filtri bitmap ottimizzati su tutti i rami di un join a stella e utilizza regole per la valutazione dei costi per determinare se il piano fornisce il costo dell'esecuzione più basso. Se il filtro bitmap ottimizzato non è selettivo, la stima del costo è di solito troppo elevata e il piano viene ignorato. Quando si considera dove posizionare i filtri bitmap ottimizzati nel piano, Query Optimizer cerca varianti hash join, ad esempio un stack destro di hash join. I join con tabelle delle dimensioni sono implementati per eseguire per primo il join selettivo più probabile.

L'operatore nel quale è applicato il filtro bitmap ottimizzato contiene un predicato bitmap nel formato PROBE ([Opt_Bitmap1001], {[column_name]} [, 'IN ROW']). Il predicato bitmap restituisce informazioni su:

  • Il nome della bitmap che corrisponde al nome introdotto nell'operatore Bitmap. Il prefisso "Opt_" indica che è utilizzato un filtro bitmap ottimizzato.

  • La colonna sulla quale è stato eseguito il probe. Si tratta del punto da cui i dati filtrati passano attraverso l'albero.

  • Se il bitmap probe utilizza l'ottimizzazione all'interno delle righe. In questo caso, il bitmap probe viene richiamato con il parametro IN ROW. In caso contrario, il parametro è mancante.

Esempio

Nell'esempio seguente è rappresentata una query su uno schema star semplice. Le due tabelle delle dimensioni DimProduct e DimCustomer si uniscono alla tabella dei fatti FactInternetSales utilizzando un join chiave primaria a chiave esterna su una sola colonna integer.

USE AdventureWorksDW2008R2;
GO
SELECT * 
FROM dbo.FactInternetSales AS F
INNER JOIN dbo.DimProduct AS D1 ON F.ProductKey = D1.ProductKey
INNER JOIN dbo.DimCustomer AS D2 ON F.CustomerKey = D2.CustomerKey
WHERE D1.StandardCost <= 30 AND D2.YearlyIncome <= 50000;

Nella figura seguente viene illustrato il piano di esecuzione per questa query come potrebbe essere visualizzato in SQL Server 2005. Nei punti contrassegnati 1A, le tabelle delle dimensioni sono state analizzate e le informazioni necessarie per filtrare e escludere le righe non risultanti dalla tabella dei fatti (1B) sono note. Tuttavia, le proprietà dell'operatore Table Scan mostrano che nessun predicato è utilizzato per limitare le righe restituite dalla tabella dei fatti.

Piano di query di SQL Server senza filtri bitmap

Al contrario, nella figura seguente viene illustrato il piano di esecuzione della stessa query come potrebbe essere visualizzato in SQL Server 2008. Gli operatori bitmap ottimizzati sono utilizzati nei sottoalberi di entrambe le tabelle delle dimensioni. Le proprietà dell'operatore Table Scan mostrano che i filtri (bitmap probe) da questi sottoalberi sono applicati direttamente all'albero della tabella dei fatti per limitare le righe restituite dalla tabella dei fatti in anticipo rispetto alla prima operazione di join.

Piano di query di SQL Server con filtri bitmap

Requisiti per l'applicazione di filtri bitmap ottimizzati

L'applicazione di filtri bitmap ottimizzati ha i seguenti requisiti

  • Le tabelle dei fatti si prevede che abbiano almeno 100 pagine. Query Optimizer considera le tabelle più piccole come tabelle delle dimensioni.

  • Vengono considerati solo gli inner join tra una tabella dei fatti e una tabella delle dimensioni.

  • Il predicato di join tra la tabella dei fatti e la tabella delle dimensioni deve essere un join colonna singolo, ma non è necessario che sia una relazione tra chiave primaria e chiave esterna. È preferita una colonna basata su integer.

  • Join con le dimensioni sono considerati solo quando le cardinalità di input delle dimensioni sono più piccole della cardinalità di input dalla tabella dei fatti.