Domanda

Ho intenzione di progettare un DW e ho sentito parlare di viste materializzate. In realtà io voglio creare una visione e dovrebbe aggiornare automaticamente quando tabelle di base sono cambiate. Qualcuno può spiegare con un esempio di query ..

È stato utile?

Soluzione

Si chiamano viste indicizzate in SQL Server - leggere questi white paper per più di fondo:

In sostanza, tutto quello che dovete fare è:

  • creare una vista normale
  • creare un indice cluster su quella vista

e il gioco è fatto!

La parte difficile è: la vista deve soddisfare un certo numero di vincoli e limitazioni - quelli sono descritte nella carta bianca. Se si esegue questa operazione - che è tutto quello che c'è. La visualizzazione viene aggiornata automaticamente, senza bisogno di manutenzione.

Risorse aggiuntive:

Altri suggerimenti

Anche se puramente da punto di vista ingegneristico, viste indicizzate suonano come qualcosa che tutti possono utilizzare per migliorare le prestazioni, ma il vero scenario di vita è molto diversa. Ho avuto successo sta usando viste indicizzate in cui ho più bisogno di loro a causa delle troppe restrizioni su ciò che può essere indicizzato e che cosa non può.

Se hai outer join nelle viste, non possono essere utilizzati. Inoltre, espressioni di tabella comuni non sono ammessi ... In realtà se avete qualsiasi ordinamento in subselect o tabelle derivate (come ad esempio con partizione dalla clausola), siete fuori di fortuna anche.

che lascia solo scenari molto semplici da utilizzano viste indicizzate, qualcosa a mio parere può essere ottimizzato con la creazione di indici corretti, nella tabelle sottostanti in ogni caso.

I saranno entusiasti di sentire alcuni scenari di vita reale in cui le persone hanno effettivamente utilizzate viste indicizzate a loro vantaggio e non avrebbe potuto fare senza di loro

Potrebbe essere necessario un po 'più di fondo su quello che una vista materializzata in realtà è. In Oracle si tratta di un oggetto che si compone di una serie di elementi quando si tenta di costruire altrove.

Un FINMUL è essenzialmente un'istantanea dei dati provenienti da un'altra fonte. A differenza di una vista i dati non si trova quando si esegue una query la vista è memorizzato localmente in una forma di tavolo. Il FINMUL viene aggiornata utilizzando una procedura di sfondo che prende il via a intervalli regolari o quando i dati vengono modificati fonte. Oracle consente aggiornamenti completi o parziali.

In SQL Server, vorrei utilizzare il seguente per creare una base per FINMUL (completo) aggiornare regolarmente.

In primo luogo, una visione. Questo dovrebbe essere facile per la maggior parte dal momento di vista sono abbastanza comuni in qualsiasi database Successivamente, un tavolo. Questo dovrebbe essere identica alla vista in colonne e dati. Questo memorizzerà un'istantanea della visualizzazione dei dati. Poi, una procedura che tronca la tabella e ricarica si basano sui dati attuali nella vista. Infine, un lavoro che fa scattare la procedura per avviarlo di lavoro.

Tutto il resto è sperimentazione.

Quando vista indicizzata non è un'opzione, e gli aggiornamenti rapidi non sono necessari, è possibile creare una tabella di cache trucco:

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

vista poi sp_rename / tavolo o modificare domande o altre viste che fanno riferimento al punto al tavolo della cache.

programma giornaliero / notte / settimanale / quant'altro di aggiornamento come

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

NB: questo mangerà spazio, anche nei log TX. Più utilizzati per piccoli insiemi di dati che sono lenti da calcolare. Forse refactoring per eliminare "facili ma grandi" colonne dapprima in una vista esterna.

Per MS T-SQL Server, suggerisco di guardare in creazione di un indice con la "include" dichiarazioni. Unicità non è richiesto, né l'ordinamento fisico dei dati associati con un indice cluster. L ' "indice ... include ()" crea una memorizzazione dei dati fisico separato gestito automaticamente dal sistema. E 'concettualmente molto simile ad un Oracle vista materializzata.

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top