Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
[SQL SERVER] Index
martedì 25 gennaio 2011 - 10.15
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
VB.NET
|
SQL Server 2008 R2
tankian
Profilo
| Junior Member
83
messaggi | Data Invio:
mar 25 gen 2011 - 10:15
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
8.814
messaggi | Data Invio:
mer 26 gen 2011 - 10:30
>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
83
messaggi | Data Invio:
mer 26 gen 2011 - 10:58
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
8.814
messaggi | Data Invio:
mer 26 gen 2011 - 11:37
>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
83
messaggi | Data Invio:
gio 27 gen 2011 - 10:59
Ok, ti ringrazio molto!
Torna su
Stanze Forum
Elenco Threads
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 !