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 的 db 文件。如果我将第二行更改为,这些数字变为 1.4 秒和 864K

create table person_id(person_id integer nonclustered primary key);

为什么会这样?

4

3 回答 3

5

DBA StackExchange 提供了一个很好的答案:https ://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered/7744#7744

于 2013-03-12T01:57:23.907 回答
2

聚类主键将其与行一起存储;这意味着它占用的空间更少(因为没有单独的索引块)。然而,通常它的主要好处是范围扫描通常可以访问同一块中的行,从而减少 IO 操作,这在您拥有大型数据集(而不是 50k 整数)时变得相当重要。

我认为 50k 整数是一个相当人为的基准,而不是你在现实世界中关心的基准。

于 2010-01-26T09:53:51.177 回答
0

[仅作为一个想法]

也许当您明确指定将整数列作为聚集键时,它就是这样做的。但是当你告诉它不要使用你的整数列时,它仍然会在后台创建一个索引,但会选择不同的数据类型来做这件事,假设是两倍大。然后这些条目中的每一个都必须引用表中的记录,在这里,大小正在爆炸式增长。

于 2010-01-26T09:48:35.347 回答