简介:我通过以下方式填充了一个表:
insert into the_table (...) select ... from some_other_table
Run Code Online (Sandbox Code Playgroud)
运行上述查询没有上the_table主键是15倍〜比运行速度更快有一个主键,我不明白为什么.
细节:我认为最好通过代码示例来解释.
我有一张桌子:
create table the_table (
a int not null,
b smallint not null,
c tinyint not null
);
Run Code Online (Sandbox Code Playgroud)
如果我添加主键,则此插入查询非常慢:
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;
Run Code Online (Sandbox Code Playgroud)
没有主键,相同的插入查询大约快15倍.但是,在没有主键填充the_table之后,我可以添加主键约束,这只需要几秒钟.这个对我来说真的没有意义.
更多信息:
有任何想法吗?
我有一个大型数据库(90GB数据,70GB索引)在过去一年中一直在缓慢增长,并且增长/变化不仅引起了索引的大量内部碎片,而且导致了表本身的大量内部碎片.
很容易解决(大量)非常分散的索引 - REORGANIZE或REBUILD将根据它们的碎片程度来处理它 - 但我在清理实际表碎片时可以找到的唯一建议是添加聚簇索引到桌子.之后我会立即删除它,因为我不希望桌面上有聚簇索引,但是有没有另一种方法可以在没有聚簇索引的情况下执行此操作?一个"DBCC"命令会这样做吗?
谢谢你的帮助.
sql-server sql-server-2005 fragmentation dbcc database-fragmentation