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ファイルを作成します。2行目を次のように変更すると、これらの数値は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 int ではない) がある場合に重要になります。

50k ints はかなり人工的なベンチマークであり、現実の世界では気にするものではないと思います。

于 2010-01-26T09:53:51.177 に答える
0

[アイデアとしてのみ]

たぶん、整数列をクラスター化キーとして受け取るように明示的に指定すると、それが実行されます。ただし、整数列を使用しないように指示すると、バックグラウンドでインデックスが作成されますが、そのために別のデータ型が選択されます。たとえば、2倍の大きさです。次に、これらの各エントリはテーブル内のレコードを参照する必要があります。ここで、サイズが爆発的に増加しています。

于 2010-01-26T09:48:35.347 に答える