Indice Vista

mercoledì 30 gennaio 2008 - 01.03

<<>> Profilo | Newbie

Ho una vista gerarchica di una decina di livelli su tabelle con anche 200000 tuple ins SQL2005. Immaginate un pò, è un attimo lenta. :D

Pensavo però che mssql fosse abbastanza in grado di indicizzare la vista in auto e non impiegare un botto tutte le volte che si interroga la vista... postgress lo fà...

va beh ho detto, creerò l'indice a mano... si peccato che , la vista deve essere schema bound, lo devono essere tutte le viste/funzioni cui deve accedere (che devono pure stare nello stesso db), svariate funzioni/aggregati non si possono usare... insomma... impossibile creare indici per qualsiasi cosa che non sia una vista molto banale...

per velocizzare ho dovuto ridurmi a una tabella che memorizza il risultatato della vista e tenerla aggiornata con un trigger... cioè possibile?

io ho sql2005 express ma anche su quello normale... cambia un pelo nelle interrogazioni successive alla prima, ma cmq lento...

alx_81 Profilo | Guru

>Pensavo però che mssql fosse abbastanza in grado di indicizzare
>la vista in auto e non impiegare un botto tutte le volte che
>si interroga la vista... postgress lo fà...
Non conosco l'altro db, ma in SQL Server, una vista è una tabella VIRTUALE, e per definizione, non essendo fisica, a mio avviso è corretto che non sia indicizzata. E' solo una select salvata che viene rieseguita on demand, per modulare gli accessi e definire un ulteriore livello di sicurezza. E, sempre secondo il mio parere, è corretto così.
Una volta che indicizzi la vista hai una tabella, e il discorso cambia.

>per velocizzare ho dovuto ridurmi a una tabella che memorizza il risultatato della vista e tenerla aggiornata con un trigger...
>cioè possibile?
Che sia possibile, certo, lo è.
Che il trigger sia la soluzione migliore, non ti so dire perchè non ci spieghi per bene il problema.
Ad esempio, se si trattasse di una tabella che può essere aggiornata una volta al giorno, preferirei un approccio meno invasivo, caricando i dati tramite un'apposita stored procedure, ecc.
Più di così non posso dirti
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>Pensavo però che mssql fosse abbastanza in grado di indicizzare
>la vista in auto e non impiegare un botto tutte le volte che
>si interroga la vista... postgress lo fà...
Anche SQL Server lo fa, basta catturare una traccia col profiler da dare in pasto al Database Engine Tuning Advisor.

>va beh ho detto, creerò l'indice a mano... si peccato che , la
>vista deve essere schema bound, lo devono essere tutte le viste/funzioni
>cui deve accedere (che devono pure stare nello stesso db), svariate
>funzioni/aggregati non si possono usare... insomma... impossibile
>creare indici per qualsiasi cosa che non sia una vista molto
>banale...
Capito niente
Inizia ad analizzare il piano di esecuzione della vista, individua le operazioni più onerose (tipo full table scan, Index Scan, ecc) e crea i dovuti indici clustered|non clustered sulle tabelle base richiamate dalla vista.
Dalla versione 2000 SQL Server permette di materializzare le viste, ma questa opportunità va valutata attentamente dato che modificando i dati nelle tabelle base, dovranno essere aggiornati l'indice clustered ed eventuali indici non clustered definiti sulla vista stessa.

>per velocizzare ho dovuto ridurmi a una tabella che memorizza
>il risultatato della vista e tenerla aggiornata con un trigger...
>cioè possibile?
Consentimi, è una vaccata

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

<<>> Profilo | Newbie

>>Pensavo però che mssql fosse abbastanza in grado di indicizzare
>>la vista in auto e non impiegare un botto tutte le volte che
>>si interroga la vista... postgress lo fà...
>Anche SQL Server lo fa, basta catturare una traccia col profiler
>da dare in pasto al Database Engine Tuning Advisor.

Si dovevo guardare come funziona la cosa, ma sono stato trattwenuto dal fatto che usando la express... il tuning advisor non è previsto...

>
>>va beh ho detto, creerò l'indice a mano... si peccato che , la
>>vista deve essere schema bound, lo devono essere tutte le viste/funzioni
>>cui deve accedere (che devono pure stare nello stesso db), svariate
>>funzioni/aggregati non si possono usare... insomma... impossibile
>>creare indici per qualsiasi cosa che non sia una vista molto
>>banale...
>Capito niente
>Inizia ad analizzare il piano di esecuzione della vista, individua
>le operazioni più onerose (tipo full table scan, Index Scan,
>ecc) e crea i dovuti indici clustered|non clustered sulle tabelle
>base richiamate dalla vista.
Già fatto a suo tempo, le tabelle sono indicizzate, il prob è che la vista usa tabelle e altre viste in modo gerarchico, e dopo il primo livello facendo pesnati join su viste che non hanno indici...

>Dalla versione 2000 SQL Server permette di materializzare le
>viste, ma questa opportunità va valutata attentamente dato che
>modificando i dati nelle tabelle base, dovranno essere aggiornati
>l'indice clustered ed eventuali indici non clustered definiti
>sulla vista stessa.

mmm sembra interessante... come'è i ltermine inglese di questa operazione che cerco un pò?
>
>>per velocizzare ho dovuto ridurmi a una tabella che memorizza
>>il risultatato della vista e tenerla aggiornata con un trigger...
>>cioè possibile? possibile nel senso che questo sia l'unico modo.... non se siaa possibile farlo :D adesso purtroppo è così che gira
>Consentimi, è una vaccata

E' lo sò :D ma l'unico modo per avere una query di 10sec anziche 3 minuti... sè mi sapete dire una alternativa ne sarei molto felice

Per chi magari lo sa, dico che questa megavista è impiantata sul DB sqlserver del programma AdHoc di Zucchetti... una merda.. ridondante... non in forma normale... uno schifo... ma quello è...
>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

lbenaglia Profilo | Guru

>Già fatto a suo tempo, le tabelle sono indicizzate, il prob è che la vista
>usa tabelle e altre viste in modo gerarchico, e dopo il primo livello facendo
>pesnati join su viste che non hanno indici...
Le viste non hanno indici, ma le tabelle base richiamate sei sicuro che siano indicizzate a dovere (indici adeguati, deframmentati e statistiche aggiornate)?
Te ne puoi rendere conto analizzando i piani di esecuzione delle query...

>>Dalla versione 2000 SQL Server permette di materializzare le
>>viste, ma questa opportunità va valutata attentamente dato che
>>modificando i dati nelle tabelle base, dovranno essere aggiornati
>>l'indice clustered ed eventuali indici non clustered definiti
>>sulla vista stessa.
>
>mmm sembra interessante... come'è i ltermine inglese di questa
>operazione che cerco un pò?

"Designing Indexed Views"
http://msdn2.microsoft.com/en-us/library/ms187864.aspx

>E' lo sò :D ma l'unico modo per avere una query di 10sec anziche
>3 minuti... sè mi sapete dire una alternativa ne sarei molto
>felice
Con i dati che ci hai fornito è un po' difficile darti una soluzione pronta per le tue esigenze.
Quello che possiamo fare è offrirti una panoramica di consigli, ma sarai tu a scegliere quelli che si adattano meglio alla situazione.

>Per chi magari lo sa, dico che questa megavista è impiantata
>sul DB sqlserver del programma AdHoc di Zucchetti... una merda..
>ridondante... non in forma normale... uno schifo... ma quello
>è...


Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

<<>> Profilo | Newbie

>>Già fatto a suo tempo, le tabelle sono indicizzate, il prob è che la vista
>>usa tabelle e altre viste in modo gerarchico, e dopo il primo livello facendo
>>pesnati join su viste che non hanno indici...
>Le viste non hanno indici, ma le tabelle base richiamate sei
>sicuro che siano indicizzate a dovere (indici adeguati, deframmentati
>e statistiche aggiornate)?

indici ok, come controllo deframmentazione e statistiche?

>Te ne puoi rendere conto analizzando i piani di esecuzione delle
>query...

Come esattamente?
>
>>>Dalla versione 2000 SQL Server permette di materializzare le
>>>viste, ma questa opportunità va valutata attentamente dato che
>>>modificando i dati nelle tabelle base, dovranno essere aggiornati
>>>l'indice clustered ed eventuali indici non clustered definiti
>>>sulla vista stessa.
>>
>>mmm sembra interessante... come'è i ltermine inglese di questa
>>operazione che cerco un pò?
>
>"Designing Indexed Views"
>http://msdn2.microsoft.com/en-us/library/ms187864.aspx

aaaaaaa ok, si s isquello lo ho guardato, ma come dicevo prima, i vincoli perchè un vista sia indicizzabile mi impediscono di applicare questa via....
>
>>E' lo sò :D ma l'unico modo per avere una query di 10sec anziche
>>3 minuti... sè mi sapete dire una alternativa ne sarei molto
>>felice
>Con i dati che ci hai fornito è un po' difficile darti una soluzione
>pronta per le tue esigenze.
>Quello che possiamo fare è offrirti una panoramica di consigli,
>ma sarai tu a scegliere quelli che si adattano meglio alla situazione.

si ovvio tranquilli è solo che non mi pare il caso di farvi mettere las testa dentro quella vista, perchè e veramente veramente molto complessa...
>
>>Per chi magari lo sa, dico che questa megavista è impiantata
>>sul DB sqlserver del programma AdHoc di Zucchetti... una merda..
>>ridondante... non in forma normale... uno schifo... ma quello
>>è...
>
>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

lbenaglia Profilo | Guru

>indici ok, come controllo deframmentazione e statistiche?
sys.dm_db_index_physical_stats
sys.stats

>>Te ne puoi rendere conto analizzando i piani di esecuzione delle
>>query...
>
>Come esattamente?
Individua le operazioni che impiegano più tempo e cerca di individuarne la causa.

>>"Designing Indexed Views"
>>http://msdn2.microsoft.com/en-us/library/ms187864.aspx
>
>aaaaaaa ok, si s isquello lo ho guardato, ma come dicevo prima,
>i vincoli perchè un vista sia indicizzabile mi impediscono di
>applicare questa via....
Bene, allora cerca di ottimizzare gli indici sulle tabelle base ed il codice T-SQL delle query.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5