104

TABLEクラスター化インデックスなしで主キーを持つことはできますか?

またTABLE、主キーなしでクラスター化インデックスを作成できますか?

主キーとクラスター化インデックスの関係を簡単に教えてもらえますか?

4

6 に答える 6

119

主キーは論理的な概念であり、テーブル内の行の一意の識別子です。そのため、多数の属性があります。null にすることはできず、一意である必要があります。もちろん、一意の識別子でレコードを検索することが多いので、主キーにインデックスを付けておくとよいでしょう。

クラスター化インデックスは物理的な概念であり、レコードがディスクに格納される順序に影響を与えるインデックスです。これにより、データにアクセスするときに非常に高速なインデックスになりますが、主キーが連番でない場合は書き込みが遅くなる可能性があります.

はい、クラスター化インデックスなしで主キーを使用できます。場合によっては、必要になる場合があります (たとえば、主キーが結合テーブルの外部キーの組み合わせであり、ディスク シャッフルのオーバーヘッドを発生させたくない場合)。書くとき)。

はい、主キーではない列にクラスター化インデックスを作成できます。

于 2013-02-24T12:54:18.247 に答える
38

テーブルはクラスター化されていない主キーを持つことができ、クラスター化されたテーブルには主キーは必要ありません。したがって、両方の質問に対する答えはイエスです。

クラスタ化インデックスは、すべての列をリーフ レベルに格納します。つまり、クラスター化インデックスにはテーブル内のすべてのデータが含まれます。クラスター化インデックスのないテーブルは、ヒープと呼ばれます。

主キーは、デフォルトでクラスター化される一意のインデックスです。デフォルトでは、主キーを作成するときに、テーブルがまだクラスター化されていない場合、主キーはクラスター化された一意のインデックスとして作成されます。オプションを明示的に指定しない限りnonclustered

t1クラスター化されていない主キーがあり、クラスター化されていないが主キーがある例t2:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

SQL Fiddle の例。

于 2013-02-24T12:53:29.587 に答える
22

まず、Index-Organized Tables と Clustered Indexes をご覧ください。実際には、全体を読むことをお勧めします Index Luke を使用してください! 何が起こっているのかを本当に理解するために、クラスタリングのトピックに到達するまで、最初からサイトを見てください。

さて、あなたの質問に...


テーブルはクラスター化インデックスなしで主キーを持つことができますか?

はい、主キーを宣言してヒープベースのテーブルを作成するときに NONCLUSTERED キーワードを使用します。例えば:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

多くの場合、実際にはヒープベースのテーブルの方が優れているにもかかわらず (リンクされた記事で説明されているように)、多くの人がデフォルト (CLUSTERED) を受け入れるように見えるため、これは残念です。


また、TABLE は主キーのないクラスター化インデックスを持つことはできますか?

他の一部の DBMS とは異なり、MS SQL Server では、主キーとは異なるクラスタリング インデックスを使用したり、主キーをまったく使用しなくても使用できます。

次の例では、PK とは別のクラスタリング インデックスを作成します。その上に UNIQUE 制約があり、ほとんどの場合はこれが必要になるでしょう。

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

一意でないクラスタリング インデックスを ( を使用してCREATE CLUSTERED INDEX ...) 選択すると、MS SQL Server は隠しフィールドを追加して自動的に一意にします。

クラスタリングの利点は、範囲スキャンで最も顕著になることに注意してください。クライアント アプリケーションによって実行される範囲スキャンと「一致」しないクラスタリング インデックスを使用する場合 (上記の隠し列に過度に依存している場合や、代理キーでクラスタリングしている場合など)、ほとんどクラスタリングの目的を無効にします。


主キーとクラスター化インデックスの関係を簡単に教えてもらえますか?

MS SQL Server では、主キーもデフォルトでクラスター化されます。上記で説明したように、そのデフォルトを変更できます。

于 2013-02-24T16:10:50.320 に答える
4

MSDN Using Clustered Indexesからの回答

テーブルはクラスター化インデックスなしで主キーを持つことができますか? - はい。

TABLE は主キーのないクラスター化インデックスを持つことができますか? - はい。

キーは、値の一意性を保証する制約であり、そのキーによって常に行を明確に識別できます。

インデックスは主キーに自動的に割り当てられます(行は主キーによって「検索」されることが多いため)。

非クラスター化インデックスは、その列の 1 つ (または複数) による行の論理的な順序付けです。これは、インデックスが配置されている列によって順序付けられた、事実上テーブルの別の「コピー」と考えてください。

クラスター化インデックスは、実際のテーブルが特定の列によって物理的に順序付けられている場合です。テーブルには常にクラスター化されたインデックスがあるとは限りません (つまり、何かによって物理的に順序付けられている間、そのことはundefinedである可能性があります)。テーブルは複数のクラスター化インデックスを持つことはできませんが、単一の複合クラスター化インデックスを持つことはできます (つまり、テーブルは姓、名、生年月日などによって物理的に順序付けられます)。

PK は多くの場合 (常にではありません)、クラスター化インデックスです。

于 2013-02-24T12:58:27.857 に答える
1

価値があるかもしれませんが、MS SQL Server では主キーのすべての列を NOT Null として定義する必要がありますが、一意のクラスター化インデックスを作成する場合はこれを必要としません。ただし、他のDBシステムについてはわかりません。

于 2015-02-23T15:39:32.237 に答える