Introduction
Indexing is the key factor of the performance. Design and architecture of the Index and table structure has changed depends on modification of application on time to time basis. We have to create new Indexes or modify the existing one to improve the performance. Some time we have to remove the index to see the performance effects and sometime we have to update the data also.
In MS SQL Server 2000 and earlier version we have only one option available is DROP Index and RE-CREATE it. But from MS SQL Server 2005 and later version have another option is called DISABLE Index. So question is in mind that, which one is preferable. In this article we are trying to discuss about the DROP INDEX and DISABLE INDEX feature and which one we choose depends on case scenario.
What Happened When Disable Index Occurs
Before understanding what happened when we Disable a index we must understand how to disable Index.
The Syntax of Disable Index is
ALTER ALTER INDEX <Index_Name>
ON <Schema_Name>.<Table_Name> DISABLE;
Now we have to understand the sys.dm_db_index_usage_stats DMV.
MS SQL Server 2005 onwards the most common way to monitor unused indexes is to use sys.dm_db_index_usage_stats DMV. As the name suggests this DMV returns the information that is tracked about index usage from SQL Server cache.
Disabling Non Clustered Index:
When we Disable a Non Clustered Index the Index page is Deleted and page is freed in the database.
Effect of Disable Non Clustered Index is mentioned bellow.
1. The Query Optimizer cannot use the Index.
2. If we have a Index hint in the SELECT statement.
For example:
SELECT *
FROM <Table_Name> WITH(INDEX(Index_Name));
is going to be Failed.
is going to be Failed.
Disabling Clustered Index:
When we Disable a Clustered Index the Data in the Table remain Exists but not accessible. Only Drop and Rebuild option can access the data.
Effect of Disable Non Clustered Index is mentioned bellow.
1. All the Non Clustered Index and Views are not available.
2. We cannot use any DML action on the Table where Clustered Index is Disable.
To Re-Enable the Index
ALTER INDEX <Index_Name>
ON <Schema_Name>.<Table_Name> REBUID;
What Happened When DROP Index Occurs
To DROP an Index we used
DROP INDEX <Index_Name>
ON <Schema_Name>.<Table_Name> REBUID;
Dropping Index is really a bad idea. When we DROP an Index, the metadata, statistics, and index pages are removed. If we drop a Clustered Index, the table will become a heap.
Effect of Dropping Index is mentioned bellow.
1. Dropping a Clustered Index make the table a Heap.
2. After Drop an Index we cannot use REBUILD options. We must recreate the Index again. So we need the Script of Index definition to Re Create it again.
So Which one to select DROP or DISABLE
First of all DROP a Clustered Index is really a bad idea. It generate Heap. By Clustered Index disable caused DML action is not working on Table.
As per my suggestion Clustered Index is created when the table is designed and do not disturb a clustered index is a good idea.
So we have to think about Non Clustered Index. Whether we DROP it or DISABLE it.
DROP a non clustered Index, need Script or Index definition to recreate it. Therefore, rather than having to script out the drop and create statements, we just disable the relevant indexes, and then issue an ALTER INDEX REBUILD for those indexes when we finished with our modifications. Not only is this a great time saver, but I get the added benefit of still saving disk space.
When an index is rebuilt we need enough disk space to store the old and new copy of the index. When an index is dropped and then recreated, the creation can use the disk space originally used for the index. The only additional space needed is for the sorting, which is about 20% of the disk size, and we can avoid using my data file for the sort if I turn on the SORT_IN_TEMPDB option.
CREATE NONCLUSTERED INDEX <Index_Name>
ON <Schema_Name>.<Table_Name>
(
<Col_Name>
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = ON,
IGNORE_DUP_KEY = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
);
Hope you like it.
Posted by: MR. JOYDEEP DAS