Il nostro progetto gestisce un database molto grande e molto complicato. Quindi circa un mese fa, abbiamo notato che lo spazio utilizzato dalle colonne indicizzate contenenti valori null stava diventando troppo grande. In risposta a ciò, ho scritto come script che avrebbe cercato dinamicamente tutti gli indici a colonna singola contenenti più dell'1% di valori null, quindi eliminandoli e ricrearli come indici filtrati a condizione che il valore NON fosse NULL. Ciò eliminerebbe e ricreare centinaia di indici in tutto il database e in genere libererebbe quasi il 15% dello spazio utilizzato dall'intero DB.
Ora ho due domande su questo:
A) Quali sono gli svantaggi dell'utilizzo di indici filtrati in questo modo? Suppongo che migliorerebbe solo le prestazioni, ma ci sono rischi per le prestazioni?
B) Abbiamo ricevuto errori ( "non è possibile eliminare l'indice XYZ perché non esiste o non si dispone dell'autorizzazione" ) quando si rilasciano e si ricreano gli indici, anche se dopo il controllo tutto è andato esattamente come previsto. Come può succedere?
Grazie per qualsiasi aiuto!
Modifica: in risposta a @Thomas Kejser
Ciao e grazie, ma risulta che questo è stato un disastro. All'epoca non capivamo diverse cose come:
- Durante una query, SQLOS crea piani di indice prima di determinare che non può utilizzare i valori NULL per unire le colonne della tabella. Ad esempio, è davvero necessario disporre di un filtro della clausola WHERE adatto all'indice per ogni indice filtrato utilizzato nella query, altrimenti l'indice non verrà utilizzato affatto.
- Eliminare e creare indici e aggiornare in modo ridondante le loro statistiche ancora una volta in seguito potrebbe non essere ancora sufficiente per produrre i piani aggiornati, che abbiamo supposto avrebbero fatto. Sembra che in alcuni casi solo un carico di lavoro abbastanza elevato costringerà SQL Server a rivalutare i piani.
- Esistono alcuni aspetti esotici della funzionalità del pianificatore di esecuzione che sono difficili da determinare solo attraverso il buon senso e la logica. Con migliaia di variazioni generate da code-based di diverse query anche, indici apparentemente inutili possono aiutare in alcune statistiche e piani di query che finiscono per essere utilizzati in query critiche.
Alla fine, questi cambiamenti sono stati ripristinati. Quindi gli indici filtrati sono uno strumento potente, ma è necessario capire veramente quali dati vengono recuperati da quelle colonne. Laddove gli indici normali a parte i problemi di spazio sono piuttosto facili da applicare, gli indici filtrati rappresentano soluzioni molto personalizzate. Non sono certamente un sostituto per un indice regolare, piuttosto un'estensione ad essi in quelle circostanze particolari che sono richieste.