Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Una visualizzazione è più veloce di una semplice query?

, le visualizzazioni possono hanno un indice cluster assegnato e, quando lo fanno, memorizzeranno risultati temporanei che possono velocizzare le query risultanti.

La documentazione di Microsoft rende molto chiaro che le viste possono migliorare le prestazioni.

Innanzitutto, la maggior parte delle visualizzazioni create dalle persone sono semplici viste e non utilizzano questa funzione e pertanto non sono diversi dall'interrogare direttamente le tabelle di base. Le visualizzazioni semplici vengono espanse sul posto e quindi non contribuiscono direttamente al miglioramento delle prestazioni - questo è vero. Tuttavia, le viste indicizzate possono drasticamente migliorare le prestazioni.

Passo direttamente alla documentazione:

Dopo la creazione di un indice cluster univoco sulla vista, il set di risultati della vista viene immediatamente materializzato e mantenuto nell'archiviazione fisica nel database, risparmiando il sovraccarico dell'esecuzione di questa costosa operazione al momento dell'esecuzione.

In secondo luogo, queste viste indicizzate possono funzionare anche quando non sono direttamente referenziate da un'altra query poiché l'ottimizzatore li utilizzerà al posto di un riferimento a una tabella quando appropriato.

Di nuovo, la documentazione:

La vista indicizzata può essere utilizzata in un'esecuzione di query in due modi. La query può fare riferimento direttamente alla vista indicizzata o, cosa ancora più importante, Query Optimizer può selezionare la vista se determina che la vista può essere sostituita per alcune o tutte le query nel piano di query a costo più basso. Nel secondo caso, viene utilizzata la vista indicizzata al posto delle tabelle sottostanti e dei loro indici ordinari. Non è necessario fare riferimento alla vista nella query affinché Query Optimizer la utilizzi durante l'esecuzione della query. Ciò consente alle applicazioni esistenti di trarre vantaggio dalle viste indicizzate appena create senza modificare tali applicazioni.

Questa documentazione, così come i grafici che dimostrano i miglioramenti delle prestazioni, sono disponibili qui.

Aggiornamento 2: la risposta è stata criticata sulla base del fatto che è l '"indice" a fornire il vantaggio in termini di prestazioni, non la "Visualizzazione". Tuttavia, questo è facilmente confutato.

Diciamo che siamo una società di software in un piccolo paese; Userò la Lituania come esempio. Vendiamo software in tutto il mondo e conserviamo i nostri archivi in ​​un database SQL Server. Abbiamo molto successo e quindi, in pochi anni, abbiamo più di 1.000.000 di record. Tuttavia, spesso abbiamo bisogno di segnalare le vendite a fini fiscali e scopriamo che abbiamo venduto solo 100 copie del nostro software nel nostro paese d'origine. Creando una vista indicizzata solo dei record lituani, possiamo conservare i record di cui abbiamo bisogno in una cache indicizzata come descritto nella documentazione di MS. Quando eseguiamo i nostri rapporti per le vendite lituane nel 2008, la nostra query cercherà in un indice con una profondità di appena 7 (Log2(100) con alcune foglie inutilizzate). Se dovessimo fare lo stesso senza VIEW e basandoci solo su un indice nella tabella, dovremmo attraversare un albero di indici con una profondità di ricerca di 21!

Chiaramente, la vista stessa ci fornirebbe un vantaggio in termini di prestazioni (3x) rispetto al semplice utilizzo dell'indice da solo. Ho provato a usare un esempio del mondo reale, ma noterai che un semplice elenco di vendite lituane ci darebbe un vantaggio ancora maggiore.

Nota che sto solo usando un b-tree dritto per il mio esempio. Sebbene sia abbastanza certo che SQL Server utilizzi qualche variante di un b-tree, non conosco i dettagli. Tuttavia, il punto vale.

Aggiornamento 3: È emersa la domanda se una vista indicizzata utilizzi solo un indice posizionato sulla tabella sottostante. Cioè, per parafrasare:"una vista indicizzata è solo l'equivalente di un indice standard e non offre nulla di nuovo o unico per una vista". Se questo fosse vero, ovviamente, l'analisi di cui sopra non sarebbe corretta! Consentitemi di fornire una citazione dalla documentazione Microsoft che dimostri perché penso che questa critica non sia valida o vera:

L'uso degli indici per migliorare le prestazioni delle query non è un concetto nuovo; tuttavia, le viste indicizzate offrono ulteriori vantaggi in termini di prestazioni che non possono essere raggiunti utilizzando gli indici standard.

Insieme alla citazione sopra relativa alla persistenza dei dati nell'archiviazione fisica e ad altre informazioni nella documentazione su come vengono creati gli indici su Views, penso che si possa affermare con sicurezza che una vista indicizzata non solo un SQL Select memorizzato nella cache che utilizza un indice definito nella tabella principale. Pertanto, continuo a sostenere questa risposta.