聚集索引与非聚集索引的主键

10
begin transaction;
create table person_id(person_id integer primary key);
insert into person_id values(1);
... snip ...
insert into person_id values(50000);
commit;

这段代码在我的电脑上大约需要0.9秒,并创建一个占用392K的数据库文件。如果我将第二行更改为,这些数字变为1.4秒和864K

create table person_id(person_id integer nonclustered primary key);

为什么会这样?

3个回答

5

2

将主键进行聚类,可以将其与行一起存储;这意味着它占用的空间较小(因为没有单独的索引块)。通常,它的主要优点是范围扫描通常可以访问位于同一块中的行,从而减少IO操作,当你有一个大数据集时这变得非常重要(不是50k个int)。

我认为50k个int是一个相当人为的基准,并且在现实世界中你并不关心它。


如果我不打算使用连接或范围扫描,只关心插入性能 - 是否有比第一个示例更好的创建表的方法? - Elite Mx
如果您只关心插入性能,应该根本不使用索引(如果支持的话),或将数据写入文本文件中。向文本文件追加数据非常快。 - MarkR

0

[仅仅是一个想法]

也许当您明确指定将整型列作为聚集键时,它确实会这样做。但是当您告诉它不要使用整数列时,它仍然在幕后创建索引,但选择了不同的数据类型,比如说两倍大小。然后每个条目都必须引用表中的记录,这样就导致了大小的爆炸。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接