Ma connaissance de niveau inférieur de SQL (Server 2008) est limitée et est maintenant remise en question par nos DBA. Permettez-moi d'expliquer (j'ai mentionné des déclarations évidentes dans l'espoir d'avoir raison, mais si vous voyez quelque chose qui ne va pas, dites-moi s'il vous plaît) le scénario:
Nous avons une table qui contient des «ordonnances judiciaires» pour les gens. Lorsque j'ai créé la table, (Nom: CourtOrder), je l'ai créée comme:
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
J'ai ensuite appliqué un index non clusterisé à la clé primaire (pour plus d'efficacité). Ma raison est qu'il s'agit d'un champ unique (clé primaire), et devrait être indexé, principalement à des fins de sélection, comme nousSelect from table where primary key = ...
J'ai ensuite appliqué un index CLUSTERED sur PersonId. La raison était de regrouper physiquement les commandes d'une personne en particulier, car la grande majorité du travail consiste à obtenir des commandes pour une personne. Alors,select from mytable where personId = ...
J'ai été tiré dessus maintenant. On m'a dit que nous devrions mettre l'index clusterisé sur la clé primaire et l'index normal sur le personId. Cela me semble très étrange. Tout d'abord, pourquoi placeriez-vous un index clusterisé sur une colonne unique? qu'est-ce que le clustering? C'est sûrement un gaspillage de l'index clusterisé? J'aurais cru qu'un index normal serait utilisé sur une colonne unique. De plus, le regroupement de l'index signifierait que nous ne pouvons pas regrouper une colonne différente (une par table, non?).
Le raisonnement pour lequel on me dit que j'ai fait une erreur est qu'ils pensent que mettre un index groupé sur PersonId ralentirait les insertions. Pour le gain de vitesse de 5% d'une sélection, nous obtiendrions une dégradation de 95% de la vitesse sur les insertions et les mises à jour. Est-ce correct et valide?
Ils disent que parce que nous regroupons le personId, SQL Server doit réorganiser les données chaque fois que nous insérons ou modifions le PersonId.
Alors j'ai demandé, pourquoi SQL aurait-il le concept d'un INDEX CLUSTERED, si c'est si lent? Est-ce aussi lent qu'ils le disent? Comment dois-je configurer mes index pour obtenir des performances optimales? J'aurais pensé que SELECT était plus utilisé que INSERT ... mais ils disent que nous avons des problèmes de verrouillage sur INSERTS ...
J'espère que quelqu'un pourra m'aider.