-
Index multi-colonnes
Bonjour à tous,
Je dois optimiser des programmes utilisant une base SQL Server. J'hésite concernant la manière de créer l'index le plus approprié. Dois-je prendre en compte le nombre estimé d'enregistrements pour déterminer l'ordre des clés de l'index ?
Exemple : la table OFA_AFF (ordre de fabrication d'une ligne de commande, regroupant plusieurs sociétés) contient :
IDT_SOC 1
NUM_OFA 2
NUM_CDE 3
NUM_LIG 4
NUM_SEQ
QTE_TOT
...
Les 4 premiers champs sont les clés de la table (index unique non cluster).
IDT_SOC peut avoir une dizaine de valeurs différentes, pour chaque IDT_SOC on a plusieurs milliers de NUM_CDE ayant chacune plusieurs dizaines de NUM_LIG (NUM_CDE commence à 1 pour chaque IDT_SOC, NUM_LIG commence à 1 pour chaque NUM_CDE). Chaque NUM_LIG peut donner lieu à plusieurs NUM_OFA (commence à 1 pour chaque IDT_SOC).
Je dois boucler sur OFA_AFF pour faire la somme de QTE_TOT pour une ligne de commande donnée (donc en fixant les valeurs de IDT_SOC, NUM_CDE et NUM_LIG).
Quel est le meilleur index entre :
- IDT_SOC, NUM_CDE, NUM_LIG, QTE_TOT
- NUM_CDE, NUM_LIG, IDT_SOC, QTE_TOT
Est-ce indifférent ?
Je vous remercie par avance pour vos lumières.
Bon week-end,
Joël
-
Un index ne se pose pas in abstracto. Il se pose en fonction des requêtes...
Or SQL Server est le seul SGB Relationnel a auto-diagnostiquer les index à poser et cela depuis plus de 15 ans...
Il suffit donc de mettre ta base en exploitation, et au bout d'un temps raisonnable de lui demander les index à poser avec la requête suivante par exemple :
Code:
SELECT * FROM sys.dm_db_missing_index_details
Pour plus d'information sur le sujet, je t'invite à lire l'article que j'ai écrit à ce sujet :
http://mssqlserver.fr/aide-au-diagno...ms-sql-server/
A +
-
Merci beaucoup Frédéric pour cette réponse.
Je m'attendais plutôt à une réponse plus simple ;)...
Je suis au niveau développement, je n'ai pas accès aux bases de données en production...Je vais faire remonter...
Encore merci,
Joël
-
Pour le besoin décrit, les deux index vont être équivalent (la quantité étant dans la partie couvrante de l'index, pas la partie indexée).
Mais on essaie d'utiliser le minimum d'index pour répondre au maximum de requêtes, c'est en ce sens que SQLpro vous répond qu'il vaut mieux laisser la base regarder tout ce qui se passe.
De manière générale pour maximiser l'usage, les colonnes utilisées par le plus de requêtes sont à mettre en premier.
-
Merci beaucoup Waldar, pour cette réponse, qui m'arrange.
La plupart des tables ont déjà des index de type IDT_SOC, NUM_CDE... car le logiciel impose de choisir la société dans laquelle travailler.
Bonne journée,
Joël