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
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
[ID]
[FirstCol]
CONSTRAINT [PK_TableName] PRIMARY
([ID] ASC)
)
GO
--
CREATE
([FirstCol] ASC)
GO
--
INSERT
SELECT 1, 'First'
UNION ALL
SELECT 2, 'Second'
UNION ALL
SELECT 3, 'Third'
GO
--
ALTER
GO
--
INSERT
SELECT 4, 'Fourth'
UNION ALL
SELECT 5, 'Fifth'
GO
--
ALTER
GO
--
INSERT
SELECT 6, 'Sixth'
UNION ALL
SELECT 7, 'Seventh'
GO
--
ALTER
GO
--
ALTER
GO
--
INSERT
SELECT 6, 'Sixth'
UNION ALL
SELECT 7, 'Seventh'
GO
--
DROP
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