sql-server – SQL Server插入和不使用主键的性能

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server插入和不使用主键的性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
总结:我有一个表格填充如下:
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你的表.

希望这可以帮助.

猜你在找的MsSQL相关文章