对数据表创建了聚集索引后,当向表中插入数据时,数据库会对数据按照索引进行重新排序存储。 所以,对于频繁执行insert操作的表,在对聚集索引的创建上,需要做权衡,有时需考虑不建立聚集索引。
如下用例说明了使用与不使用聚集索引时,数据的存储情况。
if not object_id('test_no_cx') is null
drop table test_no_cx
if not object_id('test_has_cx') is null
drop table test_has_cx
--创建一个不含索引的表test_no_cx
create table test_no_cx(id int, name varchar(20), createtime datetime default(getdate()))
--插入若干条记录(注意:这里故意打乱id的顺序)
insert test_no_cx(id, name) values(100,'100''s value')
insert test_no_cx(id, name) values(5,'5''s value')
insert test_no_cx(id, name) values(90,'90''s value')
--创建含索引的表test_has_cx
create table test_has_cx(id int, name varchar(20), createtime datetime default(getdate()))
create clustered index ix_test_has_cx on test_has_cx(id)
--将test_no_cx中的记录批量插入到test_has_cx中
insert test_has_cx select * from test_no_cx
--此时比较两表的记录如下:
--向两表中插入一条同样的记录
insert test_no_cx(id, name) values(50,'50''s value')
insert test_has_cx(id, name) values(50,'50''s value')
--此时比较两表的记录如下:
注:以上sql可直接运行。