Questo articolo condivide l'importanza degli indici in un database SQL. Inoltre, fornisce una breve panoramica degli indici cluster e non cluster. Inoltre, l'articolo illustra i motivi del danneggiamento dell'indice di SQL Server, i fattori per identificare qualsiasi indice danneggiato e i metodi per risolverlo.
Gli indici in SQL Server consentono di accelerare il processo di recupero delle righe da una tabella o da una vista. Tuttavia, la scelta corretta degli indici è fondamentale per migliorare le prestazioni delle query. SQL Server supporta indici cluster e non cluster. Il danneggiamento di uno qualsiasi di questi indici può causare ritardi nel recupero delle righe. Inoltre, potresti ottenere valori diversi o eliminati durante il recupero di alcune righe. Inoltre, le query con l'esecuzione più lunga potrebbero diventare difettose a causa di indici danneggiati nelle tabelle.
Qualunque sia la situazione, è necessario riparare il danneggiamento degli indici a tempo debito per evitare che il flusso di lavoro del database di SQL Server venga danneggiato.
Prima di discutere i metodi per risolvere i problemi di danneggiamento degli indici, esaminiamo brevemente gli indici cluster e non cluster.
Panoramica degli indici cluster e non cluster
L'applicazione di un vincolo di chiave primaria su una colonna all'interno di una tabella crea un indice cluster sulla colonna. Un indice cluster ordina i dati fisicamente e archivia i dati in una tabella in base alla chiave di indice definita. Poiché possiamo ordinare i dati in un solo ordine, non è possibile avere più di un indice cluster.
Tuttavia, un indice non cluster ordina e archivia i dati separatamente dalle righe di una tabella. In sostanza, è una copia di colonne di dati di tabella con collegamenti alla tabella associata. A differenza degli indici cluster, puoi avere uno o più indici non cluster.
Quali sono le cause del danneggiamento dell'indice di SQL Server?
Gli indici possono essere fortemente frammentati nel tempo (a causa di operazioni di inserimento, aggiornamento o eliminazione in blocco) e richiedono una manutenzione periodica. Gli indici frammentati possono causare prestazioni di query scadenti e possono essere danneggiati. Inoltre, fattori come l'aggiornamento della versione di SQL Server, bug nel programma SQL, arresto improvviso del sistema e così via possono causare il danneggiamento dell'indice di SQL Server. In particolare, l'esecuzione di una "istruzione UPDATE complessa con suggerimento NOLOCK" sulla tabella può causare il danneggiamento dell'indice non cluster.
Prima di discutere i metodi per riparare il danneggiamento negli indici di SQL Server, diamo un'occhiata a come identificare gli indici danneggiati.
Come identificare la corruzione nell'indice di SQL Server?
Puoi determinare se un indice è danneggiato utilizzando i seguenti metodi:
- Recupera le righe con valori diversi o eliminati, quindi esegui un comando "ROWID" per identificare le voci mancanti. Puoi anche rintracciare le voci mancanti controllando il log degli errori SQL.
- L'esecuzione di DBCC CHECKDB riporterà il seguente messaggio di errore se hai un indice non cluster danneggiato.
Msg 2511, Livello 16, Stato 1, Linea 31
Errore tabella:ID oggetto 613577224, ID indice 2, ID partizione 72057594041401344,
alloc unit ID 72057594047037440 (digitare i dati IN-row).
Chiavi fuori uso a pagina (1:264), slot 2 e 3.
- Se hai un indice cluster, potresti ricevere il seguente messaggio di errore:
Server:Msg 1902, Livello 16, Stato 3, Linea 1
Impossibile creare più di un indice cluster nella tabella "Nome tabella". Elimina l'indice cluster esistente "Nome indice cluster" prima di crearne un altro.
Come riparare il danneggiamento dell'indice di SQL Server?
Segui questi metodi gratuiti che puoi utilizzare per riparare il danneggiamento dell'indice di SQL Server:
Metodo 1:ripristino da backup
Se sospetti il danneggiamento di un indice cluster o non cluster, utilizza il backup per ripristinare i dati interessati prima che si verificasse il danneggiamento.
Tuttavia, il ripristino dal backup non funzionerà se nel backup mancano gli ultimi aggiornamenti. Potrebbe anche portare alla perdita di dati. In tal caso, prova il metodo successivo.
Metodo 2:elimina e ricrea l'indice danneggiato
Nota: Funziona solo per indici non cluster.
Elimina tutto o un indice specifico che mostra il danneggiamento seguendo questi passaggi:
- Connettiti a un'istanza del server in SQL Server Management Studio (SSMS) .
- Su "Esplora oggetti" finestra, espandi il database che contiene la tabella con l'indice danneggiato.
- Fai clic con il pulsante destro del mouse sulla tabella, seleziona "Tabella script come" opzione, passa con il mouse su 'DROP And CREATE To' e fai clic su Nuovo editor di query
Se non riesci a ricreare gli indici danneggiati, puoi provare a riparare gli indici.
Metodo 3:riparare il database SQL
Come ultima risorsa, eseguire il comando DBCC CHECKDB con "REPAIR_ALLOW_DATA_LOSS" per il database che ha un indice danneggiato (cluster o non cluster) su una tabella. Ma ciò potrebbe comportare la perdita di dati. Come soluzione alternativa, prova a utilizzare uno strumento di riparazione SQL come Stellar Repair per MS SQL. Lo strumento aiuta a riparare i file di database (.mdf e .ndf) e ripristina indici, viste, stored procedure e tutti gli altri componenti. Puoi importare gli indici ripristinati e altri oggetti di database direttamente in un database attivo o nuovo.
Scarica la versione demo del software di riparazione del database SQL per visualizzare in anteprima gli indici recuperabili prima di salvare il file riparato.
Conclusione
Se si sospetta il danneggiamento di un indice, utilizzare i fattori descritti nell'articolo per determinare se l'indice è danneggiato o meno. Inoltre, controlla i possibili motivi alla base del danneggiamento dell'indice di SQL Server e i metodi per riparare il danneggiamento. I metodi includono il ripristino del database dal backup, l'eliminazione e la ricreazione degli indici, la riparazione del database e il ripristino di tutti i suoi componenti. Potresti anche prendere in considerazione l'utilizzo di uno strumento di riparazione SQL per correggere gli indici SQL cluster e non cluster danneggiati e ripristinare gli oggetti di database inaccessibili.