web-dev-qa-db-fra.com

Relation entre la clé primaire et l'index clusterisé

Une TABLE peut-elle avoir une clé primaire sans index clusterisé?

et une table peut-elle avoir un index clusterisé sans clé primaire?

Quelqu'un peut-il me dire brièvement la relation entre la clé primaire et l'index clusterisé?

80
F11

Une clé primaire est un concept logique - c'est l'identificateur unique d'une ligne dans une table. En tant que tel, il a un tas d'attributs - il peut ne pas être nul, et il doit être unique. Bien sûr, étant donné que vous recherchez souvent des enregistrements à l'aide de leur identifiant unique, il serait bon de disposer d'un index sur la clé primaire.

Un index clusterisé est un concept physique - c'est un index qui affecte l'ordre dans lequel les enregistrements sont stockés sur le disque. Cela en fait un index très rapide lors de l'accès aux données, bien que cela puisse ralentir les écritures si votre clé primaire n'est pas un nombre séquentiel.

Oui, vous pouvez avoir une clé primaire sans index clusterisé - et parfois, vous souhaiterez (par exemple, lorsque votre clé primaire est une combinaison de clés étrangères sur une table de jointure et que vous ne voulez pas subir la surcharge de lecture aléatoire du disque lors de l'écriture).

Oui, vous pouvez créer un index en cluster sur des colonnes qui ne sont pas une clé primaire.

80
Neville Kuyt

Une table peut avoir une clé primaire qui n'est pas en cluster et une table en cluster ne nécessite pas de clé primaire. Donc, la réponse aux deux questions est oui.

Un index en cluster stocke toutes les colonnes au niveau feuille. Cela signifie qu'un index clusterisé contient toutes les données de la table. Une table sans index clusterisé s'appelle un tas.

Une clé primaire est un index unique mis en cluster par défaut. Par défaut, cela signifie que lorsque vous créez une clé primaire, si la table n'est pas encore en cluster, la clé primaire sera créée en tant qu'index unique en cluster. Sauf si vous spécifiez explicitement l'option nonclustered.

Un exemple, où t1 a une clé primaire non clusterisée, et t2 n'est pas en cluster mais possède une clé primaire:

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);

Exemple chez SQL Fiddle.

31
Andomar

Tout d’abord, jetez un oeil à Tables indexées et indexés en cluster . En fait, je vous recommande de lire le tout tilisez Index Luke! depuis le début jusqu'à ce que vous atteigniez le sujet du clustering pour vraiment comprendre ce qui se passe.

Maintenant, à vos questions ...


Une TABLE peut-elle avoir une clé primaire sans index clusterisé?

Oui, utilisez le mot clé NONCLUSTERED lors de la déclaration de votre clé primaire pour créer une table basée sur le tas. Par exemple:

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

Cela est regrettable, car beaucoup de personnes semblent accepter uniquement la valeur par défaut (qui est CLUSTERED), même si, dans de nombreux cas, une table basée sur des tas serait en fait préférable (comme indiqué dans l'article lié).


et une table peut-elle avoir un index clusterisé sans clé primaire?

Contrairement à d'autres SGBD, MS SQL Server vous permet de disposer d'un index de clustering différent de la clé primaire, voire de ne pas en disposer du tout.

L'exemple suivant crée un index de clustering distinct de la PC, qui est surmonté d'une contrainte UNIQUE, ce que vous souhaiteriez probablement dans la plupart des cas:

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

Si vous choisissez un index de cluster non unique (en utilisant CREATE CLUSTERED INDEX ...), MS SQL Server le rendra automatiquement unique en lui ajoutant un champ caché.

Veuillez noter que les avantages de la mise en cluster sont les plus visibles pour les analyses de plages. Si vous utilisez un index de cluster qui ne "s'aligne" pas sur les analyses de plages effectuées par votre/vos application (s) (par exemple, lorsque vous dépendez trop de la colonne masquée mentionnée ci-dessus ou que vous classez sur une clé de substitution =), vous êtes en train de nier le but du regroupement.


Quelqu'un peut-il me dire brièvement la relation entre la clé primaire et l'index clusterisé?

Sous MS SQL Server, la clé primaire est également mise en cluster par défaut . Vous pouvez modifier cette valeur par défaut, comme indiqué ci-dessus.

16
Branko Dimitrijevic

Réponses de MSDN à l'aide d'index clusterisés

Une table peut-elle avoir une clé primaire sans index cluster? - Oui.

Une table peut-elle avoir un index clusterisé sans clé primaire? - Oui.

Une clé primaire est une contrainte qui garantit l'unicité des valeurs, telles qu'une ligne peut toujours être identifiée spécifiquement par cette clé.

Un index est automatiquement attribué à une clé primaire (car les lignes sont souvent "recherchées" par leur clé primaire).

Un index non clusterisé est un ordre logique de lignes, par une (ou plusieurs) de ses colonnes. Considérez-le comme une autre "copie" de la table, ordonnée par les colonnes de l'index.

Un index clusterisé est le moment où la table réelle est physiquement commandée par un colonne. Une table n'aura pas toujours un index clusterisé (c’est-à-dire qu’elle sera physiquement ordonnée par quelque chose , cette chose pourrait être non défini ). Une table ne peut pas avoir plus d'un index en cluster, bien qu'elle puisse avoir un seul index en cluster composite (c'est-à-dire que la table est ordonnée physiquement, par exemple, par nom, prénom, date de naissance).

La PK est souvent (mais pas toujours) un index clusterisé.

4
Sepster

Pour ce qui peut en valoir la peine, dans MS SQL Server, toutes les colonnes de la clé primaire doivent être définies avec la valeur NOT Null, alors que la création d'un index en cluster unique ne l'exige pas. Vous n'êtes pas sûr des autres systèmes de base de données.

1
robotj

Cela ne correspond peut-être pas à la réponse à cette question, mais certains aspects importants concernant la clé primaire et les index clusterisés sont ->

S'il existe une clé primaire (Par défaut, qui est un index clusterisé, nous pouvons toutefois le changer) avec un index clusterisé, nous ne pouvons pas créer un autre index clusterisé pour cette table. Mais s'il n'y a pas encore de jeu de clés primaires et d'index clusterisé, nous ne pouvons pas créer de clé primaire avec Index clusterisé.

0
himanshupareek66