【问题标题】:Clustered vs NonClustered Primary Key集群主键与非集群主键
【发布时间】:2011-01-09 10:59:54
【问题描述】:
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);

为什么会这样?

【问题讨论】:

    标签: performance sqlite clustered-index


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我不打算进行连接,也不打算进行范围扫描,只关心插入性能 - 有没有比第一个示例更好的创建表的方法?
      • 如果您只关心插入性能,您应该完全不使用索引(如果支持),或者将数据写入文本文件。附加到文本文件非常快。
      【解决方案3】:

      [仅作为一个想法]

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

      【讨论】:

        猜你喜欢
        • 2012-05-29
        • 2011-01-18
        • 2017-11-07
        • 2011-02-05
        • 2021-11-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多