Migliorare le prestazioni delle query con le viste materializzate
Le viste materializzate sono query prescritte con join e filtri la cui definizione viene salvata e i risultati vengono salvati in modo permanente in un pool SQL dedicato. Non sono supportate per impostazione predefinita dai pool SQL serverless.
Le viste materializzate comportano un miglioramento delle prestazioni poiché i dati all'interno della vista possono essere recuperati senza dover risolvere la query sottostante sulle tabelle di base. È anche possibile applicare altri filtrare e integrare altre query come se si trattasse di una tabella. Inoltre, è possibile definire una distribuzione della tabella all'interno della definizione della vista materializzata diversa dalla tabella su cui si basa.
Di conseguenza, è possibile usare le viste materializzate per migliorare le prestazioni di query complesse o lente. Con la modifica dei dati nelle tabelle di base sottostanti, i dati nella vista materializzata verranno aggiornati automaticamente senza alcuna interazione da parte dell'utente.
Prima di definire una vista materializzata, è necessario tenere presenti alcune restrizioni:
L'elenco SELECT nella definizione della vista materializzata deve soddisfare almeno uno di questi due criteri:
- L'elenco SELECT contiene una funzione di aggregazione.
- Viene usata l'istruzione GROUP BY nella definizione della vista materializzata e tutte le colonne in GROUP BY vengono incluse nell'elenco SELECT. Nella clausola GROUP BY si possono usare fino a 32 colonne.
Le aggregazioni supportate includono MAX, MIN, AVG, COUNT, COUNT_BIG, SUM, VAR, STDEV.
Nella definizione sono supportate solo le distribuzioni hash e round_robin delle tabelle.
La vista materializzata supporta solo CLUSTERED COLUMNSTORE INDEX.
Di seguito è riportato un esempio di creazione di una vista materializzata denominata myview mediante una distribuzione hash e la selezione di due colonne da una tabella e il relativo raggruppamento.
create materialized view mview
with(distribution=hash(col1))
as select col1, col2 from dbo.table group by col1, col2;