Disable Index and Insert!!! Is this the solution???
In order to speed the import of our large amount of data we want to
disable all non-clustered indexes. The easiest way of doing this is to
disable the clustered index since whenever
we disable a clustered index; it disables all the non-clustered indexes on the
table as well.
NOTE: An interesting side-effect that saves us the time of disabling each
non-clustered index individually but presents us with a serious problem: once a clustered index is disabled, users can
not access the underlying table data.
Let me say that again: once a clustered index is disabled, users can not access the underlying table data.
Let me say that again: once a clustered index is disabled, users can not access the underlying table data.
So, we want the ease of disabling all indexes at once but need to
mitigate the rather pesky side-effect of losing access to the data that occurs
when one disables a clustered index. The way to do that is to disable the
clustered index, then re-enable it, leaving the non-clustered indexes disabled.
Lets fuel up our discussion by stimulate the same scenario, we are create
table InsertNdisableIndexDemo
and defining cluster index on primary key and non cluster index on fName, sName
and education
create table InsertNdisableIndexDemo
(id int identity(1,1) primary key clustered,
fName varchar(10),
sName varchar(10),
age int,
education varchar(10))
command(s) completed
successfully.
create nonclustered index
nonClusterd_fName ON InsertNdisableIndexDemo (fName)
create nonclustered index
nonClusterd_sName ON InsertNdisableIndexDemo (sName)
create nonclustered index
nonClusterd_education ON
InsertNdisableIndexDemo (education)
Command(s) completed
successfully.
Now we have indexes
on place for InsertNdisableIndexDemo table, lets query the sys.indexs table to
see all the indexes and the status of each index.
select name 'IndexName',
type_desc, is_disabled from sys.indexes
where object_id = (select object_id from sys.objects where name = 'InsertNdisableIndexDemo')
IndexName type_desc is_disabled
-------------------------------
--------- -----------
PK__InsertNd__3213E83F403A8C7D CLUSTERED
0
nonClusterd_fName NONCLUSTERED 0
nonClusterd_sName NONCLUSTERED 0
nonClusterd_education NONCLUSTERED 0
(4 row(s) affected)
We can see from the
result of query that all indexes are in place and are in enable status. Now our
task is to diable the indexes so as to ease the work of importing data to sql
server, for this we will be taking the below approach, let find out each step
Follow this procedure:
- Disable all
indexes on a table by disabling the clustered index
- Rebuild only the
clustered index (since a rebuild is the method for re-enabling an index),
leaving the non-clustered indexes disabled
- Check disabled
indexes
- Check to make
sure no clustered indexes are disabled in the database
- Import the data
- Rebuild all
indexes (since a rebuild is the method for re-enabling an index) on a
table
Disable all indexes on a table by disabling the
clustered index
We are now disabling our cluster index, which
will ultimately all non cluster index will get disable.
alter index PK__InsertNd__3213E83F403A8C7D on InsertNdisableIndexDemo disable
Warning: Index
'nonClusterd_fName' on table 'InsertNdisableIndexDemo' was disabled as a result
of disabling the clustered index on the table.
Warning: Index
'nonClusterd_sName' on table 'InsertNdisableIndexDemo' was disabled as a result
of disabling the clustered index on the table.
Warning: Index 'nonClusterd_education'
on table 'InsertNdisableIndexDemo' was disabled as a result of disabling the
clustered index on the table.
We can check out the indexes status by querying the sys.indexes table
select name 'IndexName', type_desc, is_disabled from sys.indexes
where object_id = (select object_id from sys.objects where name = 'InsertNdisableIndexDemo')
IndexName type_desc is_disabled
-------------------------------
--------- -----------
PK__InsertNd__3213E83F403A8C7D CLUSTERED
1
nonClusterd_fName NONCLUSTERED 1
nonClusterd_sName NONCLUSTERED 1
nonClusterd_education NONCLUSTERED 1
(4 row(s) affected)
As to our
discussion all the non cluster indexes are disabled by disabling the cluster
index.
Now if we try to insert data to the
table, it will give error
insert into InsertNdisableIndexDemo
select 'Akansha','Patnaik',24,'BE'
Msg 8655, Level 16,
State 1, Line 1
The query processor
is unable to produce a plan because the index 'PK__InsertNd__3213E83F403A8C7D'
on table or view 'InsertNdisableIndexDemo' is disabled.
Reason: Cluster index is disable
Rebuild clustered index
alter index PK__InsertNd__3213E83F403A8C7D on InsertNdisableIndexDemo rebuild
Command(s) completed
successfully.
This will rebuild
only the clustered index, re-enabling access to the data. Now lets check the
disable index
select name 'IndexName', type_desc, is_disabled from sys.indexes
where object_id = (select object_id from sys.objects where name = 'InsertNdisableIndexDemo')
IndexName type_desc is_disabled
-------------------------------
--------- -----------
PK__InsertNd__3213E83F403A8C7D CLUSTERED
0
nonClusterd_fName NONCLUSTERED 1
nonClusterd_sName NONCLUSTERED 1
nonClusterd_education NONCLUSTERED 1
(4 row(s) affected)
Now, checking the disabled indexes on InsertNdisableIndexDemo
shows that only the non-clustered indexes are disabled.
Once all non cluster index gets disabled, you can go ahead and
perform your import/insert of data to your table.
insert into InsertNdisableIndexDemo
select 'Akansha','Patnaik',24,'BE'
union all
select 'Pratiksha','Sharma',24,'Mtec'
union all
select 'Aadhya','Mohapatra',24,'BE'
union all
select 'Prajna','Das',24,'Btec'
union all
select 'Nandani','Ray',24,'MBA'
union all
select 'Apali','Mohanty',24,'CA'
union all
select 'Niharika','Patnaik',24,'BE'
(7 row(s) affected)
Once the insert completes we can rebuild all indexes which will both
re-enable the indexes and update them with the new data.
alter index all on InsertNdisableIndexDemo rebuild
select name 'IndexName', type_desc, is_disabled from sys.indexes
where object_id = (select object_id from sys.objects where name = 'InsertNdisableIndexDemo')
IndexName type_desc is_disabled
-------------------------------
--------- -----------
PK__InsertNd__3213E83F403A8C7D CLUSTERED
0
nonClusterd_fName NONCLUSTERED 0
nonClusterd_sName NONCLUSTERED 0
nonClusterd_education NONCLUSTERED 0
(4 row(s) affected)
Just code,have fun. Enjoy the game