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


91

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

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

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

回答:


102

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

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

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

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


1
こんにちは。トピックは古いですが、多分誰かが私の質問に答えることができます。列がNOT NULL UNIQUE CLUSTERED INDEXとして宣言されている場合、それをPRIMARY KEYにすると、パフォーマンスなどに実際の変更が行われますか?
jesse

それは興味深い質問です。どちらの方法でも同じチェックをすべて実行する必要があるので、私はノーと仮定します。
ジョナサンアレン

素晴らしい答え。
NikosV 2018

しかし、ほとんどの場合、クラスター化インデックスを持つ主キー列は、範囲の検索を大幅に簡略化するために役立ちます。
hunter_tech

33

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

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

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


18

まず、インデックス構成テーブルとクラスター化インデックスをご覧ください。実際、私はインデックスルークをすべて読むことをお勧めします!何が起こっているのかを本当に理解するためにクラスタリングト​​ピックに到達するまでの最初からサイト。

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


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

はい、主キーを宣言してヒープベースのテーブルを作成する場合は、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では、主キーもデフォルトでクラスター化されます。上記のように、そのデフォルトを変更できます。


4

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

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

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

A 主キーは、ある制約性を保証が行が常にそのキーによって特異的に同定することができるように、値の一意こと。

インデックスは、(行が頻繁に彼らの主キーで「見上げ」されていると)、自動的に主キーに割り当てられています。

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

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

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


SQL Serverでは、主キーはデフォルトでクラスター化されます-明示的に指定しない限り、クラスター化されます。ただし、これはデフォルトであり、要件ではありません。
marc_s 2013

テーブルはインデックスなしで主キーを持つことができますか?というのも、1つの列が主キーであると言うと、デフォルトではクラスター化インデックスが作成されるからです。インデックスを削除すると、テーブルに主キーが含まれなくなりますか?
veljasije 2013

1

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


これは、正しいものとしてマークされた回答の下のコメントです。
Jan Doggen、2015

1
ようこそ-コメントを追加する評判がまだないので、+ 1を差し上げます。(そこで見た、それを行った:)
リバースエンジニア

0

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

クラスター化インデックスを持つ主キー(デフォルトではクラスター化インデックスですが、それを変更できます)がある場合、そのテーブルにクラスター化インデックスをもう1つ作成できません。ただし、主キーセットがまだなく、クラスター化インデックスがある場合、クラスター化インデックスを使用して主キーを作成することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.