In order to improve your
applications and your databases, they will need to change over time. The
structure of the database changes, the structure of the tables change, the data
in the tables change, the application changes, the queries against the data change.
Indexes that once aided performance now sit unused while new indexes are added.
When index needs change and you want
to test how removing an index will affect performance, you have two options –
you can disable or drop the index. Which is better?
Disabling
an Index
To disable in index, issue an ALTER
INDEX command.
ALTER
INDEX IX_IndexName ON Schema.TableName DISABLE
What happens when you do this? The
metadata about the index is retained, as are the usage statistics in
sys.dm_db_index_usage_stats. The index is not usable by the query optimizer,
however. If you have an index hint in a query specifying the index, the query
will fail. Also, foreign key constraints are disabled.
Disabling a nonclustered index will
delete the index pages – the space is freed in the database.
Disabling a clustered index has
additional effects. The data in the table still exists, but will be
inaccessible for anything other than a drop or rebuild operation. All related
nonclustered indexes and views are also unavailable. Foreign key constraints
that reference the table are disabled. Queries against the table will fail.
If you want to re-enable the index,
you need to rebuild it – there is no ALTER INDEX…ENABLE command.
ALTER
INDEX IX_IndexName ON Schema.TableName REBUILD
When you rebuild an index, the usage
stats will be reset in sys.dm_db_index_usage_stats.
Dropping
an Index
To drop a clustered or nonclustered
index, issue a DROP INDEX command.
DROP
INDEX IndexName ON Schema.TableName
When you do this, the metadata,
statistics, and index pages are removed. If you drop a clustered index, the
table will become a heap.
Once an index has been dropped, it
can’t be rebuilt – it must be created again. Thus, if you are going to drop an
existing index, make sure you script the CREATE statement also. If it is
determined that you need it again in the future, it will be much easier to open
the script than try to remember how you had it set up previously!
Do
you want to maintain statistics?
The biggest difference between
disabling and dropping an index is whether the metadata and statistics are
persisted. If disabled, they are. If dropped, they are not. Make sure you
carefully weigh your options before performing either action, and always have a
way to recreate the index available.
No comments:
Post a Comment