This article shares the importance of indexes in a SQL database. Also, it provides a brief overview of the clustered and nonclustered indexes. Further, the article discusses reasons for SQL Server index corruption, factors to identify any corrupted index, and methods to fix it.
Indexes in SQL Server help speed up the process of retrieving rows from a table or view. However, the correct choice of indexes is crucial to improve query performance. SQL Server supports clustered and nonclustered indexes. Corruption in any of these indexes can cause delay in fetching rows. Also, you may get different or deleted values while retrieving some rows. In addition, the longest-running queries may become faulty due to corrupted indexes on tables.
Whatever be the situation, you must repair corruption in indexes in due time to prevent the SQL Server database workflow from getting affected.
Before discussing the methods to troubleshoot index corruption, let’s briefly overview clustered and nonclustered indexes.
Overview of Clustered and Non-Clustered Indexes
Applying a primary key constraint on a column within a table creates a clustered index on the column. A clustered index sorts the data physically and stores the data in a table based on its defined index key. Since we can sort data in only one order, it is not possible to have more than one clustered index.
However, a nonclustered index sorts and stores data separately from the rows in a table. Essentially, it is a copy of columns of table data having links to the associated table. Unlike clustered indexes, you can have one or more nonclustered indexes.
What Causes SQL Server Index Corruption?
Indexes can get heavily fragmented over time (due to bulk insert, update, or delete operations) and requires periodic maintenance. Fragmented indexes can cause poor query performance and may get corrupted. Also, factors like upgrading the version of SQL Server, bug in the SQL program, sudden system shutdown, etc. can lead to SQL Server index corruption. Particularly, running a ‘complex UPDATE statement with NOLOCK hint’ on table can cause non-clustered index corruption.
Before discussing the methods to repair corruption in SQL Server indexes, let’s check out how to identify corrupted indexes.
How to Identify Corruption in Index of SQL Server?
You can determine if an index is corrupted using the following methods:
- Fetch rows having different or deleted values, and then run a ‘ROWID’ command to identify any missing entries. You can also trace the missing entries by checking the SQL error log.
- Running DBCC CHECKDB will report the following error message if you’ve a corrupted nonclustered index.
Msg 2511, Level 16, State 1, Line 31
Table error: Object ID 613577224, index ID 2, partition ID 72057594041401344,
alloc unit ID 72057594047037440 (type IN-row data).
Keys out of order on page (1:264), slots 2 and 3.
- If you’ve a clustered index, you may receive the following message showing error:
Server: Msg 1902, Level 16, State 3, Line 1
Cannot create more than one clustered index on table ‘Table Name’. Drop the existing clustered index ‘Clustered Index Name’ before creating another.
How to Repair SQL Server Index Corruption?
Follow these free methods you can use to repair SQL Server index corruption:
Method 1 – Restore from Backup
Whether you suspect corruption in a clustered or nonclustered index, use backup to restore the affected data before corruption occurred.
However, restoring from backup won’t work if the backup is missing latest updates. It may even lead to data loss. In that case, try the next method.
Method 2 – Drop and Recreate Corrupted Index
Note: This only works for non-clustered indexes.
Drop all or specific index showing corruption by following these steps:
- Connect to a server instance in SQL Server Management Studio (SSMS).
- On the ‘Object Explorer’ window, expand the database that contains the table with corrupted index.
- Right-click on the table, select the ‘Script Table as’ option, hover over ‘DROP And CREATE To’ and click on the New Query Editor
If you fail to recreate corrupted indexes, you can try repairing the indexes.
Method 3 – Repair the SQL Database
As a last resort, run the DBCC CHECKDB command with ‘REPAIR_ALLOW_DATA_LOSS’ for the database that has corrupted (clustered or nonclustered) index on a table. But this may result in data loss. As an alternative solution, try using a SQL repair tool like Stellar Repair for MS SQL. The tool helps repair database files (.mdf and .ndf) and restores indexes, views, stored procedures, and all other components. You can import the restored indexes and other database objects directly into a live or new database.
Download the demo version of SQL database repair software to preview the recoverable indexes before saving the repaired file.
If you suspect corruption in an index, use the factors outlined in the article to determine if the index is corrupted or not. Also, check out the possible reasons behind SQL Server index corruption and methods to repair corruption. The methods include restoring database from backup, dropping and recreating the indexes, and repairing the database and restoring all its components. You may also consider using a SQL repair tool to fix the corrupted clustered and non-clustered SQL indexes and recovers inaccessible database objects.