27/06/12

Come indicizzare una vista su Sql Server

Come sappiamo per migliorare le prestazioni di lettura di una tabella contenente una grossa mole di dati, applichiamo degli indici sui campi per i quali vengono effettuate maggiormente le queries.

 

Molti non sanno però che gli indici possono essere applicati anche alle viste.

Molte volte utilizziamo nei software per comodità delle viste dove con opportuni join mostriamo una serie di dati da varie tabelle in maniera più leggibile.

Con l’andare del tempo però, la mole dei dati aumenta e diventa indispensabile fare qualcosa per migliorare le prestazioni in lettura della vista.

Una delle cose che è possibile fare è indicizzare la vista.

La cosa però non è tanto semplice perché vi sono dei prerequisiti.

Supponiamo per comodità che la nostra vista si chiami pippo ed appartenga allo schema di default dbo.

Innanzitutto la vista deve essere stata creata con l’opzione WITH SCHEMABINDING altrimenti non possono essere applicati gli indici. Provando ad aggiungerli infatti uscirebbe questo errore: Cannot create index on view 'dbo.pippo' because the view is not schema bound. (Microsoft SQL Server, Error: 1939).

Per creare una vista con lo schemabinding basta semplicemente indicarlo nella clausola di creazione (cancellatela e ricreatela in questo modo)

CREATE VIEW DBO.PIPPO WITH SCHEMABINDING AS SELECT data FROM DBO.TABELLA

Come vedete abbiamo indicato lo schema del database cui appartengono sia la vista sia la tabella: questo è il secondo prerequisito,lo schema di appartenenza va sempre indicato, altrimenti otteniamo l’ errore Cannot schema bind view 'dbo.pippo’ because name 'tabella' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

Terzo prerequisito è che non è possibile utilizzare caratteri jolly: i campi vanno specificati singolarmente.

Il quarto prerequisito è che se la vista è una union di più tabelle, bisogna creare n viste indicizzate per quante sono le tabelle nella union e poi creare una vista complessiva.

Per creare un indice non clustered sulla vista, dobbiamo almeno crearne uno clustered. Se ad esempio vogliamo metterne uno sul campo data, la sintassi è la seguente:

CREATE UNIQUE CLUSTERED INDEX [Indice] ON [dbo].[pippo]
(
[data] ASC
)
GO

Le viste indicizzate risultano molto utili perchè i dati vengono letti come se fossero in una tabella, ma lo sono meno per le query che non contengono join o che sono relative a tabelle che si aggiornano molto di frequente.

Un’unica controindicazione cui bisogna fare molta attenzione è che una volta che una vista è stata creata con lo schemabinding non possiamo più modificare la struttura delle tabelle coinvolte nelle viste, dobbiamo prima rimuovere lo schemabinding (con una alter vies pippo as select ecc. ecc. senza with schemabinding) e poi è possibile cambiare la struttura.

1 commento:

Cosa ne pensi?