[SQL SERVER] Index

martedì 25 gennaio 2011 - 10.15
Tag Elenco Tags  VB.NET  |  SQL Server 2008 R2

tankian Profilo | Junior Member

Ciao, ho una SP che effettua degli UPDATE FROM con SUB SELECT.

Naturalmente dipende dai filtri utilizzati e dalla mole di dati può arrivare ad impegare minuti per completare l'esecuzone.

Utilizzando il query optimizer, con l'aggiunta di 2 partizioni diverse statistiche ed indici la query viene migliorata del 69%, (questo vi fa capire il mio grado di conoscenze in struttura DB).

Comunque il fatto è questo: aggiungere indici e partizioni ha i suoi ovvi vantaggi, ma allo stesso tempo in fase di insert ed update delle tabelle indicizzate i tempi si allungano.

Mi è stato consigliato di attivare e disattivare gli indici a seconda delle operazioni da fare, è una strada percorribile secondo voi?

Mentre per le partizioni come mi dovrei comportare?

Altra domanda, se gli indici li inserissi in delle viste, cambierebbe qualcosa?

Grazie.

alx_81 Profilo | Guru

>Ciao, ho una SP che effettua degli UPDATE FROM con SUB SELECT.
Ciao

>Comunque il fatto è questo: aggiungere indici e partizioni ha
>i suoi ovvi vantaggi, ma allo stesso tempo in fase di insert
>ed update delle tabelle indicizzate i tempi si allungano.
sì, gli indici sono un vero vantaggio in lettura, ed un possibile svantaggio in scrittura (dipende da quali sono e quanti, il tutto verte sui page split e i riordinamenti in generale)

>Mi è stato consigliato di attivare e disattivare gli indici a seconda delle operazioni da fare, è una strada percorribile secondo voi?
devi fare attenzione. Disabilitando i clustered index non avrai più accesso ai dati. Inoltre, se hai repliche, potrebbe essere molto scomodo farlo.
Al di là di questo, che puoi approfondire qui (http://technet.microsoft.com/en-us/library/ms177406.aspx) il problema è che quando riabiliti (http://technet.microsoft.com/en-us/library/ms190645.aspx) l'indice viene ricostruito, e comunque perdi tempo per ricrearlo. Quindi dovrai testare quale soluzione è la migliore in base ai tempi che riesci ad ottenere provando un po' tutte le combinazioni di soluzioni possibili.
Visto che però effettivamente alcuni minuti sono veramente tanti su database, magari puoi focalizzarti sul migliorare/ottimizzare la tua update con un tuning più approfondito.

>Mentre per le partizioni come mi dovrei comportare?
Anche qui, dipende dai casi reali. Dipende da quali sono le chiavi di partizionamento, dal numero di dati, da cosa devi fare con la tecnica del partizionamento nel tuo caso, ecc.

>Altra domanda, se gli indici li inserissi in delle viste, cambierebbe qualcosa?
Se fai una vista indicizzata, alla fine, fai una versione fisica della vista, che quindi si comporterebbe come una tabella, con la differenza che la vista indicizzata è sincronizzata con i dati delle tabelle che la compongono. Sinceramente non seguo spesso questa strada, non ne ho mai avuto vera esigenza.

>Grazie.
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

tankian Profilo | Junior Member

Ciao alex

>Se fai una vista indicizzata, alla fine, fai una versione fisica della vista, che quindi si comporterebbe come una >tabella, con la differenza che la vista indicizzata è sincronizzata con i dati delle tabelle che la compongono. >Sinceramente non seguo spesso questa strada, non ne ho mai avuto vera esigenza.

Aspetta, forse non ho capito bene.

Se io le SELECT che mi interessano le faccio diventare delle Viste indicizzate, essendo che diventano fisiche e sincronizzate alle tabelle da cui prende i dati, ad ogni insert ed update delle tabelle aggiornerebbe sempre e comunque gli indici della vista, quindi non dovrebbe cambiare niente.

>devi fare attenzione. Disabilitando i clustered index non avrai più accesso ai dati. Inoltre, se hai repliche, >potrebbe essere molto scomodo farlo.
>Al di là di questo, che puoi approfondire qui (http://technet.microsoft.com/en-us/library/ms177406.aspx) il >problema è che quando riabiliti (http://technet.microsoft.com/en-us/library/ms190645.aspx) l'indice viene >ricostruito, e comunque perdi tempo per ricrearlo. Quindi dovrai testare quale soluzione è la migliore in base >ai tempi che riesci ad ottenere provando un po' tutte le combinazioni di soluzioni possibili.

Quando si riabilita un indice, viene ricostruito tutto l'indice o solo per gli eventuali record nuovi?

Grazie mille.

alx_81 Profilo | Guru

>Aspetta, forse non ho capito bene.
>
>Se io le SELECT che mi interessano le faccio diventare delle
>Viste indicizzate, essendo che diventano fisiche e sincronizzate
>alle tabelle da cui prende i dati, ad ogni insert ed update delle
>tabelle aggiornerebbe sempre e comunque gli indici della vista,
>quindi non dovrebbe cambiare niente.
operazioni dml di inserimento ed aggiunta, modificano gli indici relativi allo stesso tempo. Poi entrano in gioco vari fattori (fill factor, operazioni di split, riordinamenti).
Però quando inserisci dati o modifichi dati che fanno parte delle chiavi dell'indice, l'indice viene "sincronizzato". Una vista indicizzata è utile se devi leggere molto da essa.

>Quando si riabilita un indice, viene ricostruito tutto l'indice o solo per gli eventuali record nuovi?
Se leggi attentamente il link, noterai che le operazioni che vengono fatte sono proprio quelle di RICOSTRUZIONE dell'indice:

"Dopo la disattivazione, un indice rimane nello stato disattivato finché non viene ricostruito o eliminato. Per ricostruire e attivare un indice disattivato, utilizzare uno dei metodi seguenti:
Istruzione ALTER INDEX con clausola REBUILD
Istruzione CREATE INDEX con clausola DROP_EXISTING
Istruzione DBCC DBREINDEX
Queste istruzioni consentiranno di ricostruire l'indice e di impostarne lo stato su attivato."


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

tankian Profilo | Junior Member

Ok, ti ringrazio molto!
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5