可恶SQL SERVER的索引Disable后不能直接ENABLE,只有rebuild后才OK!SQL SERVER – Disable Clustered Index and Data Insert

Earlier today, I received following email.

“Dear Pinal,

We looked at your script and found out that in your script of disabling indexes, you have only included selected non-clustered index during the bulk insert and missed to disabled all the clustered index. Our DBA [name removed] has changed your script a bit and included all the clustered indexes. Since then our application is not working.

When DBA [name removed] tried to enable clustered indexes again he is facing error Incorrect syntax error.

We are in deep problem [word replaced]

[Removed Identity of organization and few unrelated stuff ]“

I have replied to my client and helped them fixed the problem. However, what really caught my attention was the concept of disabling clustered index. Let us try to learn a lesson from this experience.

In this case, there was no need to disable clustered index at all. I had done all the crucial work when I was called in to work on the tuning project. I removed unused indexes, created a few optimal indexes and wrote a script to disable selected high cost indexes when bulk insert operations (and the like) are performed. There was another script which rebuilds all the indexes as well. The solution worked until they included a clustered index in order to disable the script.

Clustered indexes are in fact original tables (or heap) which are physically ordered (any more things – not scope of this article) according to one or more keys (columns). When a clustered index is disabled, its data rows  cannot be accessed. This means that there will be no insertion process possible. On the other hand, when non-clustered indexes are disabled, all the data related to it are physically deleted, but the definition of the index is kept in the system.

Due to the same reason, even reorganization of the index is not possible until the clustered index (which was disabled) is rebuilt. Now, let us come to the second part of the question which is in regards to the receiving of the error when a clustered index is ‘enabled’. This is a very common question that I receive on the blog. (The following statement is written keeping the syntax of T-SQL in mind) Clustered indexes can be disabled but cannot be enabled again; they have to be rebuilt to become enabled. It is indeed a common thinking that something which we have ‘disabled’ can be ‘enabled’ but the syntax for this is ‘rebuild’. This issue has been explained here: SQL SERVER – How to Enable Index – How to Disable Index – Incorrect syntax near ‘ENABLE’.

Let us go over this example where inserting the data is not possible when a clustered index is disabled.

USE AdventureWorks
GO
-- Create Table
CREATE TABLE [dbo].[TableName]
(
[ID] [int]
 NOT NULL,
[FirstCol] [varchar](50
NULL,
CONSTRAINT [PK_TableName]
 PRIMARY KEY CLUSTERED
([ID] ASC
)
)
GO
-- Create Nonclustered Index
CREATE UNIQUE NONCLUSTERED INDEX [IX_NonClustered_TableName] ON
 [dbo].[TableName]
([FirstCol] ASC
)
GO
-- Populate Table
INSERT INTO
 [dbo].[TableName]
SELECT 1,
 'First'
UNION
 ALL
SELECT 2,
 'Second'
UNION
 ALL
SELECT 3,
 'Third'
GO
-- Disable Nonclustered Index
ALTER INDEX [IX_NonClustered_TableName] ON
 [dbo].[TableName] DISABLE
GO
-- Insert Data should work fine
INSERT INTO
 [dbo].[TableName]
SELECT 4,
 'Fourth'
UNION
 ALL
SELECT 5,
 'Fifth'
GO
-- Disable Clustered Index
ALTER INDEX [PK_TableName] ON
 [dbo].[TableName] DISABLE
GO
-- Insert Data will fail
INSERT INTO
 [dbo].[TableName]
SELECT 6,
 'Sixth'
UNION
 ALL
SELECT 7,
 'Seventh'
GO

-- Reorganizing Index will also throw an error
ALTER INDEX [PK_TableName] ON
 [dbo].[TableName] REORGANIZE
GO

-- Rebuliding should work fine
ALTER INDEX [PK_TableName] ON
 [dbo].[TableName] REBUILD
GO
-- Insert Data should work fine
INSERT INTO
 [dbo].[TableName]
SELECT 6,
 'Sixth'
UNION
 ALL
SELECT 7,
 'Seventh'
GO
-- Clean Up
DROP TABLE
 [dbo].[TableName]
GO

I hope this example is clear enough. There were a few additional posts I had written years ago, and they are as follows:

SQL SERVER – Enable and Disable Index Non Clustered Indexes Using T-SQL

SQL SERVER – Enabling Clustered and Non-Clustered Indexes – Interesting Fact

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值