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

91

Un peut-il TABLEavoir une clé primaire sans index clusterisé?

Et puis- TABLEje avoir un index clusterisé sans avoir de clé primaire?

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

F11
la source

Réponses:

102

Une clé primaire est un concept logique - c'est l'identifiant 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, comme vous êtes susceptible de rechercher souvent des enregistrements par leur identifiant unique, il serait bon d'avoir un index sur la clé primaire.

Un index cluster 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 qu'il 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 voudrez peut-être le faire (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 encourir la surcharge de lecture aléatoire du disque lors de l'écriture).

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

Neville Kuyt
la source
1
Salut. Le sujet est ancien, mais peut-être que quelqu'un peut répondre à ma question. Si la colonne est déclarée comme NOT NULL UNIQUE CLUSTERED INDEX, est-ce que le faire PRIMARY KEY changera réellement les performances ou quoi que ce soit?
jesse
C'est une question intéressante. Je suppose que non, car il doit effectuer toutes les mêmes vérifications dans les deux cas.
Jonathan Allen
Réponse géniale.
NikosV
Mais surtout, une colonne de clé primaire avec un index clusterisé sera utile car elle simplifie beaucoup la recherche par plage.
hunter_tech
33

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. La réponse aux deux questions est donc oui.

Un index clusterisé 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 cluster est appelée 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 mise en cluster, la clé primaire sera créée en tant qu'index unique en cluster. Sauf si vous spécifiez explicitement l' nonclusteredoption.

Un exemple, où t1a une clé primaire t2non clusterisée et n'est pas en cluster mais a 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.

Andomar
la source
18

Tout d'abord, jetez un œil aux tables organisées par index et aux index groupés . En fait, je recommande de lire l'intégralité de Use the Index Luke! site 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...
);

C'est malheureux, car beaucoup de gens semblent accepter simplement la valeur par défaut (qui est CLUSTERED), même si dans de nombreux cas une table basée sur le tas serait en fait meilleure (comme indiqué dans l'article lié).


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

Contrairement à certains autres SGBD, MS SQL Server vous permettra d'avoir un index de clustering différent de la clé primaire, ou même sans avoir la clé primaire du tout.

L'exemple suivant crée un index de clustering distinct du PK, qui a une contrainte UNIQUE au-dessus, ce que vous voudriez 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 clustering non unique (à l'aide de CREATE CLUSTERED INDEX ...), MS SQL Server le rendra automatiquement unique en lui ajoutant un champ masqué.

Veuillez noter que les avantages du clustering sont les plus visibles pour les scans de plage. Si vous utilisez un index de clustering qui ne "s'aligne" pas sur les analyses de plage effectuées par vos applications clientes (par exemple, lorsque vous utilisez trop la colonne masquée mentionnée ci-dessus ou que vous vous mettez en cluster sur une clé de substitution ), vous êtes à peu près vaincre le but du clustering.


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.

Branko Dimitrijevic
la source
4

Réponses tirées de MSDN à l'aide d'index en cluster

Une table peut-elle avoir une clé primaire sans index clusterisé? - 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, de sorte 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 des lignes, par une (ou plusieurs) de ses colonnes. Considérez-le comme une autre "copie" de la table, triée par les colonnes de l'index.

Un index clusterisé se produit lorsque la table réelle est physiquement triée par une colonne particulière. Une table n'aura pas toujours un index clusterisé (c'est-à-dire que même si elle sera physiquement ordonnée par quelque chose , cette chose peut être indéfinie ). Une table ne peut pas avoir plus d'un index clusterisé, bien qu'elle puisse avoir un seul index groupé composite (c'est-à-dire que la table est physiquement triée par exemple par nom, prénom, date de naissance).

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

Sepster
la source
Dans SQL Server, la clé primaire sera mise en cluster par défaut, à moins que vous ne lui disiez explicitement de ne pas l'être. Mais ce n'est qu'un défaut - pas une exigence.
marc_s
Une table peut-elle avoir une clé primaire sans index? Parce que, quand je dis qu'une colonne est la clé primaire, par défaut, un index clusterisé est créé. Lors de la suppression de l'index, la table ne contient plus de clé primaire?
veljasije
1

Pour ce que cela peut valoir, dans MS SQL Server, toutes les colonnes de la clé primaire doivent être définies comme NOT Null, alors que la création d'un index cluster unique ne l'exige pas. Pas sûr des autres systèmes DB.

robotj
la source
Ceci est plus un commentaire sous la réponse marquée comme la bonne.
Jan Doggen
1
Bienvenue - Je vous donne un +1 car je vois que vous n'avez pas encore la réputation d'ajouter des commentaires. (J'y suis allé, j'ai fait ça :)
Ingénieur inversé
0

Cela ne correspond peut-être pas à cette question, mais certains aspects importants de la clé primaire et des index en cluster sont ->

S'il existe une clé primaire (par défaut, qui est un index clusterisé, mais nous pouvons changer cela) 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 qu'il existe un index clusterisé, nous ne pouvons pas créer de clé primaire avec Clustered Index.

himanshupareek66
la source