web-dev-qa-db-ja.com

主キーとクラスター化インデックスの関係

テーブルにクラスター化インデックスなしで主キーを設定できますか?

およびTABLEに主キーなしのクラスター化インデックスを含めることはできますか?

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

80
F11

主キーは、論理コンセプトです。これは、テーブル内の行の一意の識別子です。そのため、多数の属性があります。nullではない可能性があり、一意である必要があります。もちろん、一意の識別子でレコードを頻繁に検索する可能性が高いため、主キーにインデックスを付けるとよいでしょう。

クラスター化インデックスは、物理コンセプトです。これは、レコードがディスクに保存される順序に影響するインデックスです。これにより、データにアクセスするときにインデックスが非常に高速になりますが、主キーが連続番号でない場合、書き込みが遅くなる可能性があります。

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

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

80
Neville Kuyt

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

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

主キーは、デフォルトでクラスター化される一意のインデックスです。デフォルトでは、主キーを作成するときに、テーブルがまだクラスター化されていない場合、主キーはクラスター化された一意のインデックスとして作成されます。 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の例

31
Andomar

まず、 Index-Organized Tables and 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では、主キーもデフォルトでクラスタ化されます。上記のように、デフォルトを変更できます。

16

クラスター化インデックスを使用したMSDN からの回答

テーブルにクラスター化インデックスなしの主キーを設定できますか?-はい。

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

Primary Keyは、値の一意性を保証するconstraintです。行は常にそのキーによって明確に識別できること。

indexは、主キーに自動的に割り当てられます(行は主キーによって「ルックアップされる」ことが多いため)。

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

クラスター化インデックスは、actualテーブルが特定の行。テーブルは常にクラスター化インデックスを持つとは限りません(つまり、物理的にsomethingで順序付けされますが、そのことはundefined)。テーブルには複数のクラスタ化インデックスを含めることはできませんが、単一の複合クラスタ化インデックスを含めることができます(つまり、テーブルは姓、名、DOBなどによって物理的に順序付けられます)。

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

4
Sepster

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

1
robotj

この質問に対する答えとしては関係ないかもしれませんが、主キーとクラスター化インデックスに関するいくつかの重要な側面は->

クラスター化インデックスにプライマリキー(既定ではクラスター化インデックスですが、変更可能)がある場合、そのテーブルにもう1つのクラスター化インデックスを作成することはできません。ただし、プライマリキーがまだ設定されておらず、クラスター化インデックスが存在する場合、クラスター化インデックスを使用してプライマリキーを作成することはできません。

0