Si une Clé Primaire Composite être mis en cluster de SQL Server?
Considérer le tableau de cet exemple (en supposant que SQL Server 2005):
create table product_bill_of_materials
(
parent_product_id int not null,
child_product_id int not null,
quantity int not null
)
Je suis en train d'étudier une clé primaire composite contenant les deux product_id colonnes (je vais certainement une contrainte unique), par opposition à une colonne d'ID unique. La Question est, d'un point de vue des performances que de la clé primaire être regroupés?
Dois-je créer un index sur chaque colonne ID afin que les recherches pour les clés étrangères sont les plus rapides? Je crois que ce tableau va être touché beaucoup plus sur le lit de l'écrit.
La base de données qui ciblez-vous. Je m'attends à la performance pourrait être une fonction de la base de données de mise en œuvre.
OriginalL'auteur Neil Barnwell | 2008-12-23
Vous devez vous connecter pour publier un commentaire.
Comme cela a déjà été dit par plusieurs autres, cela dépend de comment vous allez accéder à la table. Gardez à l'esprit cependant, que tous les SGBDR là devraient être en mesure d'utiliser l'index cluster de recherche en une seule colonne, tant que cette colonne s'affiche en premier. Par exemple, si votre index cluster est sur (parent_id, child_id), vous n'avez pas besoin d'un autre indice distinct (parent_id).
Votre meilleur pari peut être un index cluster sur (parent_id, child_id), qui se trouve également être la clé primaire, avec un index non ordonné en clusters sur (child_id).
En fin de compte, l'indexation doit être adressée après que vous avez une idée de comment la base de données sera accessible. Venir avec un certain niveau de performance des tests de stress si vous le pouvez, puis d'analyser le comportement à l'aide d'un outil de profilage (générateur de profils SQL pour SQL Server) et d'optimisation des performances à partir de là. Si vous n'avez pas l'expertise ou les connaissances pour le faire à l'avance, puis de l'essayer (je l'espère limitée) communiqué de presse de l'application, de recueillir les mesures de la performance, et de voir où vous en avez besoin pour améliorer les performances et de comprendre ce que l'index de l'aide.
Si vous faites les choses correctement, vous devriez être en mesure de capturer le profil "type" de la façon dont la base de données est accessible et vous pouvez ensuite relancer encore et encore sur un serveur de test que vous essayez différentes approches d'indexation.
Dans votre cas, je serais probablement juste de mettre un cluster PK (parent_id, child_id) au départ, puis l'ajouter à l'index non cluster seulement si j'ai vu un problème de performance qui serait aidé par.
OriginalL'auteur Tom H
"Ce que vous interrogez sur le plus souvent" n'est pas nécessairement la meilleure raison de choisir un indice pour le clustering. Ce qui importe le plus est ce que vous interrogez sur pour obtenir plusieurs lignes. Le Clustering est la stratégie appropriée pour ce qui la rend efficace pour obtenir plusieurs lignes dans le plus petit nombre de la lecture du disque.
Le meilleur exemple est l'historique des ventes pour un client.
Dire que vous avez deux index sur la table de Vente, un Client (et peut-être la date, mais le point s'applique de toute façon). Si vous interrogez la table le plus souvent sur le code client, alors vous aurez envie de tous les clients des records de Vente ensemble pour vous donner un ou deux lectures pour tous les enregistrements.
La clé primaire, otoh, que, peut-être une clé de substitution, ou SalesId, mais une valeur unique, en tout cas. Si ce ont été regroupés, il serait d'aucun avantage par rapport à la normale index unique.
EDIT: prenons cette table particulière à la discussion, il va révéler encore plus de subtilités.
Le "naturel" de la clé primaire est dans toute la probabilité parentid + childid. Mais dans quel ordre? Parentid + childid n'est pas plus unique que childid + parentid. Pour le clustering, la commande est plus approprié? On pourrait supposer qu'il doit être parentid + childid, depuis que nous aimerions poser la question suivante: "Pour un élément donné, quels sont ses constituants"? Mais il n'est pas rare de vouloir aller dans l'autre sens, et de demander "Pour une constuent, de quels éléments est-elle une composante?".
Ajouter à l'examen de "couvrant l'index", qui contiennent, dans l'index, toutes les informations nécessaires pour satisfaire à la requête. Si cela est vrai, alors vous n'avez jamais besoin de lire le reste de l'enregistrement; alors, le clustering est d'aucune utilité; il suffit de lire l'indice est suffisant. (BTW, ce qui signifie deux index sur la même paire de champs, dans l'ordre inverse, ce qui pourrait être la bonne chose à faire dans ce type de cas. Ou au moins un indice sur l'un, et un seul index de champ sur l'autre).
Mais ce n'est pas pour dicter ce qui doit être mis en cluster; qui serait finalement probablement être déterminé par les requêtes qui seront, en fait, besoin de saisir le record pour le champ Quantité.
Un exemple clair, en principe, il vaut mieux le laisser decidintg sur d'autres indices jusqu'à ce que vous pouvez les tester avec des données réalistes (bien sûr, avant de la production); mais pose la question ici pour la spéculation est inutile. Les tests seront toujours vous donner la bonne réponse.
Oubliez pas vous soucier de ralentir insère jusqu'à ce que vous avez un problème (ce qui, dans la plupart des cas, n'arrivera jamais), et permet de tester pour vous assurer d'abandonner index utiles pour un bénéfice mesurable.
Choses qui ne sont pas encore certains, cependant, parce que la jonction des tableaux comme celui-ci sont aussi souvent impliqués dans beaucoup d'autres types de requêtes. Donc, je venais d'en choisir un et de test en tant que de besoin que l'application des gels, et le volume des données pour le test devient disponible.
BTW, je m'attends à la fin avec un PK sur parentid + childid; un index non unique sur childid; et le premier cluster. Si vous préférez une mère porteuse PK, alors vous aurez encore envie d'un index unique sur parentid + childid, en cluster. Le Clustering de la clé de substitution est très rare d'être optimale.
Aussi longtemps que le parent de l'ID de la colonne est le premier champ (et il doit l'être), alors vous n'avez qu'un seul indice. Regroupement sur A, puis B, dans Un obtient toujours vous cluster par A.
Ce doit être la accepté de répondre à
OriginalL'auteur dkretz
La vraie question ici est ce qui va vous être d'interrogation sur le plus? Si vous serez à la recherche pour les deux valeurs de tous les temps, le cluster doit être sur la paire. Si vous allez à interroger plus largement sur l'un ou l'autre, vous voulez le cluster sur un.
Correct, mais juste parce que vous avez besoin de l'unique, ne signifie pas que l'unique doit être l'élément clustered. La clé, c'est la performance de la requête et de stockage des données dans la façon dont il va être interrogé.
Les index uniques sont généralement MOINS susceptibles de bénéficier de clustering. La plupart des requêtes renvoyant plusieurs lignes ne sont pas en offrant de multiples touches. Un composé de l'indice est l'exception, où vous pourriez requête à moins que le plein champ.
OriginalL'auteur Mitchel Sellers
Puisque vous dites "je suis en train d'étudier une clé primaire composite" - il y a encore peut-être temps de changer votre esprit. J'ai utilisé de nombreuses clés composites et je continue de trouver des raisons de souhaiter que je n'avais pas. Peut-être que d'autres personnes ne seront pas d'accord avec moi.
Je suis d'accord avec Mitchel réponse, le cluster va sur ce que vous interrogera sur le plus souvent.
EN général je suis d'accord sur des clés composites, mais c'est un tableau de fournir un beaucoup à beaucoup de relation et de la clé composée de deux int id des champs. Je crois qu'une clé composite qui fait le plus de sens pour cette situation.
OriginalL'auteur ScottStonehouse
Je tiens à zéro dans sur votre dernier relevé. "Je crois que ce tableau va être touché beaucoup plus sur le lit de l'écrit." Si c'est le cas, alors vous pouvez aller de l'indice-lourds. La raison pour laquelle nous ne pas aller de l'indice-lourds sur tout est de vous payer des pénalités pour les mises à jour & insère à la table. Lorsque nous avons des tables qui sont au service de plus de lecture que l'écriture puis de payer le prix pour les indices.
Que pour ce cluster, vous devriez penser à la façon dont le tableau sera utilisé au mieux. Si votre tableau est sujet à beaucoup de requêtes de plage (OÙ col1 EST ENTRE a ET b), cluster de la table, de sorte que la gamme des requêtes sera déjà mise en place dans l'ordre sur le disque. Dans SQL Server, il nous arrive de nous le cluster gratuitement avec les PKs et nous oublions ce qui est le mieux pour cluster pour commencer.
Comme pour les contraintes FK sur la table, puisque vous l'avez dit plus de lectures que les écritures de ce qui peut être acceptable. Si c'était une table avec beaucoup de plaquettes de chaque FK contrainte nécessite une validation par rapport à la table parent et qui pourrait ne pas vous donner la performance que vous désirez.
Grande question.
OriginalL'auteur Eric Sabine