Condividi tramite


Interpretazione dei piani di esecuzione che contengono filtri bitmap

I piani di esecuzione di query parallele che utilizzano l'applicazione dei filtri bitmap hanno un operatore Bitmap in uno o più sottoalberi dell'operatore. Un filtro bitmap utilizza una rappresentazione compatta di un insieme 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. Rimuovendo le righe non necessarie quanto prima nella query, gli operatori successivi hanno meno righe su cui lavorare e le prestazioni complessive della query migliorano.

In SQL Server 2008, l'applicazione del filtro bitmap può essere introdotta nel piano di query parallele 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. Un piano di query può contenere filtri bitmap e filtri bitmap ottimizzati. Query Optimizer determina quando un filtro bitmap ottimizzato o un filtro bitmap ottimizzato è sufficientemente selettivo per essere utile e a quali operatori il filtro viene applicato. Per ulteriori informazioni, vedere Ottimizzazione delle prestazioni di esecuzione delle query del data warehouse tramite l'applicazione di filtri bitmap.

Quando si analizza un piano di esecuzione che contiene l'applicazione dei filtri bitmap, è importante capire come i dati passano nel piano e dove viene applicato il filtro. In entrambi i casi, il filtro bitmap e il filtro bitmap ottimizzato sono creati 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. Tuttavia, quando il filtro bitmap è basato su una colonna integer, il filtro può essere applicato direttamente alla tabella iniziale o all'operazione di scansione dell'indice invece che all'operatore Parallelism. Questa tecnica è chiamata ottimizzazione all'interno delle righe.

Visualizzazione dei filtri bitmap negli showplan

Per visualizzare i filtri bitmap nel piano di query, utilizzare le opzioni SET: SHOWPLAN_ALL, SHOWPLAN_TEXT o SHOWPLAN_XML oppure fare clic su Includi piano di esecuzione effettivo in SQL Server Management Studio.

Se viene prodotto uno Showplan XML, gli operatori bitmap fisici e logici sono elencati nel modo seguente:

<RelOp NodeId="2" PhysicalOp="Bitmap" LogicalOp="Bitmap Create" EstimateRows="88" EstimateIO="0" EstimateCPU="0.0718125" AvgRowSize="6893" EstimatedTotalSubtreeCost="0.229385" Parallel="1" EstimateRebinds="0" EstimateRewinds="0">

L'operatore nel quale è applicato un filtro bitmap contiene il nome della bitmap nella proprietà Colonna probe.

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 Create. 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 probe della bitmap è eseguito all'interno di righe. In questo caso, il bitmap probe viene richiamato con il parametro IN ROW. In caso contrario, il parametro è mancante.

Esempio

Nell'esempio seguente si dimostra come l'applicazione di filtri bitmap ottimizzati è utilizzata in un piano di esecuzione. 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 AdventureWorksDW;
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 come un filtro bitmap ottimizzato è creato nel sottoalbero dell'operatore di entrambe le tabelle delle dimensioni dopo che la tabella della dimensione è stata analizzata e le informazioni necessarie a eliminare le righe non risultanti dalla tabella dei fatti sono conosciute. Il filtro è applicato quindi alla tabella dei fatti nel primo percorso possibile, l'operatore Table Scan. L'applicazione del filtro è mostrata nella sezione Predicato delle proprietà Table Scan. Le informazioni mostrate nel Predicato indicano che sia i filtri bitmap ottimizzati Opt_Bitmap1008 che Opt_Bitmap1009 sono utilizzati per limitare le righe restituite dalla tabella dei fatti. Le colonne sulle quali è stato eseguito il probe nella tabella dei fatti sono elencate come [F]. [CustomerKey] e [F]. [ProductKey]. Viene mostrato il parametro IN ROW, ciò indica che l'ottimizzazione all'interno delle righe è utilizzata nel processo. Se l'ottimizzazione all'interno di righe non può essere utilizzata, il filtro bitmap è applicato all'operatore Parallelism.

Piano di query di SQL Server con filtri bitmap

In base all'illustrazione, è possibile giungere alle seguenti conclusioni:

  • I filtri bitmap ottimizzati sono creati in due sottoalberi.

  • Entrambi i filtri sono applicati dinamicamente a un solo operatore (Table Scan).

  • Il filtro bitmap ottimizzato che viene stimato essere il più selettivo è implementato per primo.

  • Le colonne sulle quali alle tabelle della dimensione vengono unite in join alla tabella dei fatti consentono all'utilizzo dell'ottimizzazione all'interno di righe. Ovvero, il join è basato su una sola colonna integer.

  • Il filtro è applicato al primo punto possibile nella query, ciò comporta un numero ridotto di righe che vanno dall'operazione Table Scan agli operatori rimanenti nella struttura a albero.