【发布时间】:2011-04-01 04:58:24
【问题描述】:
总结:我有一个通过以下内容填充的表格:
insert into the_table (...) select ... from some_other_table
在 the_table 上使用 no 主键运行上述查询比 使用 主键运行它快约 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,b,c from some_view;
如果没有主键,相同的插入查询大约快 15 倍。 但是,在没有主键的情况下填充 the_table 后,我可以添加主键约束,并且只需要几秒钟。这对我来说真的没有意义。
更多信息:
- 估计的执行计划显示在聚集索引插入上花费的总查询时间为 0%
- SQL Server 2008 R2 开发者版,10.50.1600
有什么想法吗?
【问题讨论】:
-
那里没有启示。删除所有索引,插入所有数据,然后重新创建索引通常比简单地插入数据要快...
-
是的。 sql-server 中的 PK 索引集群或非集群。因此,正如 Mitch 所指出的,在没有任何索引的情况下插入然后重新创建它会快得多。
-
在没有任何唯一性约束的情况下,插入速度之快令人惊叹,尤其是在一次插入一行时。
-
记录:您所看到的是索引的内务管理需要时间。对于每次插入,索引也必须更新。删除它并在之后添加它可以消除它。索引不是免费的。它们确实加快了搜索速度,但减慢了插入速度。更新和删除取决于具体的语句。
-
@marc_s,问题是为什么 PK 会如此严重地影响性能。 15 倍的差异对我来说似乎很陡峭。我没有具体说明这个问题,你是对的。
标签: sql-server