Come creare viste materializzate in SQL Server?

Ho intenzione di progettare un DW e ho sentito parlare di visioni materializzate. In realtà, voglio creare una vista e dovrebbe aggiornarsi automaticamente quando vengono cambiate le tabelle di base. Qualcuno può spiegare con un esempio di query ..

Si chiamano viste indicizzate in SQL Server: leggi questi white paper per ulteriori informazioni:

  • Creazione di una vista indicizzata
  • Miglioramento delle prestazioni con le viste indicizzate di SQL Server 2008

Fondamentalmente, tutto ciò che devi fare è:

  • crea una vista regolare
  • creare un indice cluster su quella vista

e hai finito!

La parte delicata è la seguente: la visione deve soddisfare una serie di limiti e limiti, quelli descritti nel white paper. Se lo fai, questo è tutto quello che c’è. La vista viene aggiornata automaticamente, non è necessaria alcuna manutenzione.

Risorse addizionali:

  • Creazione e ottimizzazione delle viste in SQL Server
  • Viste indicizzate di SQL Server

Anche se puramente dal punto di vista ingegneristico, le viste indicizzate sembrano qualcosa che tutti potrebbero usare per migliorare le prestazioni, ma lo scenario della vita reale è molto diverso. Non sono riuscito a utilizzare viste indicizzate in cui ho più bisogno di loro a causa di troppe restrizioni su cosa può essere indicizzato e cosa no.

Se si dispone di join esterni nelle viste, non possono essere utilizzati. Inoltre, le espressioni di tabella comuni non sono consentite … Infatti, se avete ordini in sottosezioni o tabelle derivate (come con partizione per clausola), anche voi siete sfortunati.

Ciò lascia solo scenari molto semplici per utilizzare viste indicizzate, qualcosa che a mio parere può essere ottimizzato creando comunque indici appropriati su tabelle sottostanti.

Sarò felice di ascoltare alcuni scenari di vita reale in cui le persone hanno effettivamente utilizzato le viste indicizzate a proprio vantaggio e non avrebbero potuto fare a meno di loro

Potresti aver bisogno di un po ‘più di informazioni su cosa sia in realtà una Vista materializzata. In Oracle questi sono un object costituito da un numero di elementi quando si tenta di costruirlo altrove.

Un MVIEW è essenzialmente un’istantanea di dati di un’altra fonte. A differenza di una vista, i dati non vengono trovati quando si esegue una query sulla vista che è archiviata localmente in una forma di tabella. MVIEW viene aggiornato utilizzando una procedura in background che viene avviata a intervalli regolari o quando i dati di origine cambiano. Oracle consente aggiornamenti completi o parziali.

In SQL Server, utilizzerei quanto segue per creare regolarmente un aggiornamento di base di MVIEW (completo).

In primo luogo, una vista. Questo dovrebbe essere facile per la maggior parte dal momento che le viste sono abbastanza comuni in qualsiasi database Avanti, una tabella. Questo dovrebbe essere identico alla vista in colonne e dati. Questo memorizzerà un’istantanea dei dati della vista. Quindi, una procedura che tronca la tabella e la ricarica in base ai dati correnti nella vista. Infine, un lavoro che triggers la procedura per avviarne il lavoro.

Tutto il resto è sperimentazione.

Quando la vista indicizzata non è un’opzione e non sono necessari aggiornamenti rapidi, è ansible creare una tabella di cache delle hack:

 select * into cachetablename from myviewname alter table cachetablename add primary key (columns) -- OR alter table cachetablename add rid bigint identity primary key create index... 

quindi sp_rename view / table o cambia qualsiasi query o altra vista che faccia riferimento a puntare alla tabella della cache.

programma giornaliero / notturno / settimanale / cosa non aggiornare come

 begin transaction truncate table cachetablename insert into cachetablename select * from viewname commit transaction 

NB: questo mangerà spazio, anche nei log del tuo tx. Ideale per piccoli set di dati che sono lenti a calcolare. Forse refactoring per eliminare le colonne “facili ma grandi” prima in una vista esterna.

Per MS T-SQL Server, suggerisco di guardare alla creazione di un indice con l’istruzione “include”. L’unicità non è richiesta, né l’ordinamento fisico dei dati associati a un indice cluster. “Index … Include ()” crea un’archiviazione fisica dei dati separata gestita automaticamente dal sistema. È concettualmente molto simile a una vista materializzata di Oracle.

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx