114 votes

sql de clé primaire et de l'indice de

Dire que j'ai un ID de ligne (int) dans une base de données défini comme clé primaire. Si j'ai une requête hors de l'ID de fois dois-je aussi besoin de l'indexer? Ou faut-il être une clé primaire signifier qu'il est déjà indexé?

Raison pour laquelle je demande c'est parce que dans MS SQL Server, je peux créer un index sur cet ID, qui comme je l'ai indiqué dans ma clé primaire.

Edit: une question supplémentaire - il faire du mal à en outre l'index de la clé primaire?

80voto

le dorfier Points 27267

Vous avez raison, c'est source de confusion que de SQL Server vous permet de créer des doublons index sur le même domaine(s). Mais le fait que vous pouvez créer un autre, n'indique pas que le PK de l'indice n'est pas aussi existent déjà.

L'index supplémentaire n'est pas bon, mais le seul tort (très petit) est donc l'augmentation de la taille du fichier et la ligne de création de surcharge.

60voto

red.clover Points 919

Comme tout le monde l'ai déjà dit, les clés primaires sont automatiquement indexés.

La création de plusieurs index sur la colonne de la clé primaire n'a de sens que lorsque vous en avez besoin pour optimiser une requête qui utilise la clé primaire et certains autres colonnes spécifiques. Par la création d'un autre index sur la colonne de clé primaire et dont certains autres colonnes avec elle, vous pouvez atteindre l'optimisation d'une requête.

Par exemple, vous avez un tableau avec plusieurs colonnes, mais vous êtes la seule interrogation de l'ID, le Nom et l'Adresse de colonnes. En prenant l'ID comme clé primaire, nous pouvons créer l'index suivant qui est construit sur l'ID, mais comprend le Nom et l'Adresse de colonnes.

CREATE NONCLUSTERED INDEX MyIndex
ON MyTable(ID)
INCLUDE (Name, Address)

Donc, lorsque vous utilisez cette requête:

SELECT ID, Name, Address FROM MyTable WHERE ID > 1000

SQL Server vous donnera le résultat que l'aide de l'index que vous avez créé, et il ne le pourrez pas lire quoi que ce soit à partir de la table réelle.

29voto

Rob Williams Points 6316

NOTE: Cette réponse adresses de développement d'entreprise dans-le-grand.

C'est un SGBDR question, non seulement de SQL Server, et le comportement peut être très intéressant. Pour l'un, alors qu'il est commun pour les clés primaires pour être automatiquement (unique) indexé, il n'est PAS absolue. Il y a des moments où il est essentiel qu'une clé primaire ne PAS être indexés de façon unique.

Dans la plupart des Sgbdr, un index unique sera automatiquement créé sur une clé primaire si elle n'existe pas déjà. Par conséquent, vous pouvez créer votre propre index sur la colonne de clé primaire avant de la déclarer comme une clé primaire, alors que l'index sera utilisé (si accepté) par le moteur de base de données lorsque vous appliquez la clé primaire de la déclaration. Souvent, vous pouvez créer la clé primaire et de permettre à sa valeur par défaut index unique pour être créé, puis de créer votre propre alternative index sur cette colonne, puis déposez l'index par défaut.

Maintenant pour la partie amusante-quand avez-vous PAS envie d'un index de clé primaire unique? Vous n'en voulez pas, et ne peuvent pas tolérer, quand votre table acquiert suffisamment de données (lignes) pour faire l'entretien de l'index est trop cher. Cela varie en fonction du matériel, le SGBDR moteur, les caractéristiques de la table et la base de données, et le système de charge. Cependant, il commence généralement à se manifester une fois une table atteint quelques millions de lignes.

La question essentielle est que chaque insertion d'une ligne ou d'une mise à jour de la colonne de clé primaire de résultats dans une analyse d'index pour garantir l'unicité. Que index unique scan (ou son équivalent dans n'importe quel SGBDR) devient beaucoup plus cher que le tableau grandit, jusqu'à ce qu'il domine la performance de la table.

J'ai abordé cette question à plusieurs reprises avec des tables aussi grand que deux milliards de lignes, 8 to de stockage, et de quarante millions d'insertions de lignes par jour. J'ai été chargé de la refonte du système concerné, ce qui inclus abandon de l'index de clé primaire unique pratiquement que de la première étape. En effet, la baisse que l'indice a été nécessaire dans la production de récupérer à partir d'une coupure de courant, avant même de monter près d'une refonte. Cette refonte de trouver d'autres moyens d'assurer l'unicité de la clé primaire et de fournir un accès rapide aux données.

23voto

jcollum Points 10236

Les clés primaires sont toujours indexés par défaut.

Vous pouvez définir une clé primaire dans SQL Server 2012 à l'aide de SQL Server Management Studio ou de Transact-SQL. La création d'une clé primaire crée automatiquement un correspondant unique, cluster ou de l'index non cluster.

http://technet.microsoft.com/en-us/library/ms189039.aspx

8voto

SQLMenace Points 68670

un PK deviendra un index cluster, sauf si vous spécifiez non en cluster

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X