总结:我有一个表格填充如下:
insert into the_table (...) select ... from some_other_table
在__table上没有主键运行上面的查询比使用主键运行速度快15倍,我不明白为什么.
细节:我认为这是通过代码示例来解释的.
我有一张桌子:
create table the_table ( a int not null,b smallint not null,c tinyint not null );
alter table the_table add constraint PK_the_table primary key(a,b); -- Inserting ~880,000 rows insert into the_table (a,b,c) select a,c from some_view;
没有主键,相同的插入查询速度大约快15倍.但是,在填充没有主键的__table之后,我可以添加主键约束,只需要几秒钟.这真的对我没有意义.
更多信息:
>估计的执行计划显示在集群索引插入上花费的总查询时间的0%
> sql Server 2008 R2开发版,10.50.1600
有任何想法吗?
解决方法
这是一个很好的问题,但也是一个很糟糕的问题.在你问为什么索引减慢插入之前,你知道一个索引是什么?
如果没有,我建议你阅读它.聚集索引是一个B树(平衡树),所以每个插入都必须….等待它….平衡树.因此,集群插入比在堆上插入慢.如果您不知道堆是什么,那么建议在您了解基础知识之前停止使用sql Server.否则你试图使用一个你不知道你在做什么的产品,并且基本上在公路上开一辆卡车,蒙着眼睛,认为你骑自行车.意外结果…
因此,在填充表之后创建聚簇索引时,“堆”有一些要使用的统计信息,sql可以基本上优化一些事情.这个过程比这更复杂,但在某些情况下,您会发现在事实之后创建聚集索引可能比简单的插入更慢.这与关键类型,列数,列类型都有关系.不幸的是,这不是一个适合于答案的主题,这更多是一个整个课程,很少有本书.看上面的表格,这是一个非常简单的表,大约有7byte行.在这种情况下,插入后的创建索引将更快,但是在几个varchar(250)的等等中,并且游戏更改.
如果你不知道,一个聚集的索引(如果你的表有一个),IS你的表.
希望这可以帮助.