|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : novembre 2007 Messages : 33 ![]() |
Salut à tous,
Voilà je me suis frotté à cette question lors d'un entretien: "Dans quels cas il est préférable de ne pas utiliser d'index sur les tables ?". Quelqu'un a une réponse pertinente qu'on pour répondre à une telle question? |
|
|
00
|
|
|
#2 |
|
Membre expérimenté
![]() ![]() Inscription : mai 2005 Messages : 414 ![]() |
des tables avec très peu de lignes.
en effet, le temps qu'il balaie le btree, il a plus vite fait de faire un fetch sur la table ou un TableScan. Ou si toutes les requetes qui vont attaquer ta table ne sont pas suffisamment discriminantes alors l'index ne sert à rien. Qui plus est, l'optimiseur du SGBD peut décider de ne pas utiliser l'index meme si il est present... |
|
|
00
|
|
|
#3 | |
|
Invité régulier
![]() Inscription : novembre 2007 Messages : 33 ![]() |
Citation:
Pour les tables de petites tailles je comprends que l'index n'est pas pertinente mais la question qu'on m'a posé porte plutôt sur la nature des requêtes sur la table. |
|
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() Inscription : novembre 2004 Messages : 341 ![]() |
Bonjour
Je dirai qu'il est préférable de limiter les index sur les tables fortement modifiées (INSERT, UPDATE, DELETE) pour éviter le ralentissement des traitements. Maintenant, l'indexage est une véritable étude qui ne s'improvise pas et il faut étudier au cas par cas en s'aidant des statistiques et plans de requête. Maintenant, tu es peut-être tombé sur quelqu'un qui croit savoir alors qu'il se trompe et qui considèrera ta réponse comme erronée même si elle est vraie. Cordialement Christophe B. |
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 887 ![]() |
A propos des requêtes discriminantes.
On peut interpréter "requête discriminante" comme "requête filtrante", ce qui conduit à la notion de facteur de filtrage. Supposons que vous utilisiez une table T de un million de lignes, dotée d’une clé primaire K comportant donc autant de valeurs et faisant l’objet d’un index de type "unique". Le facteur de filtrage est optimal et le temps de réponse pour un accès en fonction d’une valeur donnée de cette clé est de l’ordre de dix à vingt millisecondes : deux ou trois accès au disque pour l’index et un accès pour les données de la table. Supposons maintenant qu’une des colonnes de T, disons C comporte les seules valeurs 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, avec une répartition homogène de ces valeurs. Si la table est indexée sur C et si vous utilisez la requête suivante : Select * From T Where C = 10 => Le SGBD va consulter ses statistiques concernant la table T et la colonne C et décidera sans doute d’utiliser l’index associé (10% seulement de lignes à consulter, mais un pourcentage plus élevé de pages de données, en fonction du nombre de lignes par page). Le facteur de filtrage est nettement moins bon, mais sera peut-être acceptable. Si maintenant la requête est la suivante : Select * From T Where C < 10 Le facteur de filtrage devient très mauvais. Le SGBD comprenant qu’il faut récupérer en gros 90% des lignes de la table, il se passera des services de l’index afin de réduire le nombre des entrées-sorties. En effet, s’il s’en sert, on peut se douter qu’il "balaiera" pratiquement toutes les lignes de la table et toutes les lignes de l’index, alors qu’en shuntant ce dernier, ça sera toujours ça d’économisé. Dans le même sens, si la colonne C ne comporte que deux valeurs (en proportions égales), disons 1 et 2, on peut prendre les paris qu’un index sur C ne sera jamais utilisé, quelle que soit la requête.
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Citation:
1) si le cout de recherche dans l'index est plus élevé que la lecture ligne à ligne, l moteur est capable de le voir et lira la table sans tenir compte de l'index 2) le coût d'insertion dans un index est aujourd'hui très minime compte tenu des algorithmes de gestion des structures des SGBDR actuels 3) il convient d'éviter de spécifier à un SGBDR la manière de faire notamment en lui intimant ou en lui interdisant d'utiliser tel ou tel index. Bref, les recruteurs qui vous ont posés ce genre de questions ne méritent vraisemblableement pas votre personne, puisque vous avez eu la curiosité de tenter d'essayer de comprendre quelque chose qu'ils n'ont jamais remis en cause depuis des lustes dans leur entreprise ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#7 |
|
Membre éclairé
![]() Étudiant Inscription : février 2006 Messages : 510 ![]() |
On m'a toujours dit qu'il fallait éviter les index lorsqu'il s'agit d'une table avec peu d'enregistrements, comme mentionné ci-haut.
Cependant, comme SQLpro l'a mentionné, les SGBD ont beaucoup évolué de nos jours et la plupart des SGBD utilisent des optimizers pour optimisé les requêtes et donc des choix comme ceci ne sont plus vraiment nécessaires. |
|
|
00
|
|
|
#8 | |||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
de fmsrel :
Citation:
Exemple : TABLE des personnes avec ID, NOM, PRENOM, SEXE Clef primaire ID => index Index (secondaire ) posé sur SEXE. Distribution des données : 90% M et 10% F sur sexe. Les requêtes suivantes vont toutes les deux utiliser l'idnex : Code :
Code :
Pourquoi ? 1) l'index sur sexe est bien moins volumineux que la table et il est ordonnée par sexe. On ne lire donc que 90% du volume de kl'idex. 2) la clef de la table sert de références aux lignes. Elle est donc aussi présente dans l'index secondaire SEXE afin de permettre de retrouver la ligne originale. Mais ceci n'est pas valable sur certains SGBDR qui fonctionne avec une notion de référence de ligne idépendante de la clef... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|||||
|
00
|
|
|
#9 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 887 ![]() |
De SQLPro :
Citation:
SELECT * FROM T WHERE C = 2Dans le même ordre d’idées, je n’ai pas parlé d’index "couvrant" (je suppose que vous faites allusion à un index comportant toutes les données nécessaires pour la résolution des requêtes), mais puisque vous y tenez, parlons-en : là encore, il est évident que, pour traiter les requêtes concernées, si le SGBD estime le coût inférieur au balayage de la table, il préférera utiliser la technique du "non matching index scan" (balayage séquentiel des feuilles), surtout s’il y a un Order By et si l’arbre est un B+ (chaînage des feuilles dans l’ordre des clés). Pour une transaction qui attaque une table de cent millions de lignes ça n’est pas génial, mais pour un batch cela peut être utile : balayer de l’ordre de cent mille à cinq cent mille pages au lieu de dix millions, à (disons) quatre millisecondes la page, c’est toujours ça de pris, surtout pour les batchs quotidiens...
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
|
00
|
|
|
#10 | |
|
Membre régulier
![]() Inscription : avril 2002 Messages : 182 ![]() |
Microsoft donne quelques règles generales ou l'utilisation d'index n'est pas neccessaire :
Citation:
|
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() ![]() |
Hier soir, j'ai regardé une conférence microsoft trés intéressante sur la société WAISSO.
http://www.microsoft.com/france/visi...7-cb2944d5ee86 Monsieur UNMAR précisait que SQL Serveur crée, comme vous le savez sans doute, un index cluster sur la clé primaire automatiquement. Dans certains cas, il est intéressant de supprimer cet index cluster si par exemple la clé primaire n'est pas utilisée. En effet, sur une grosse table, un gros index cluster peut consommer des ressources inutilement ( processeur notamment ). |
|
00
|
|
|
#12 | |
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 098 ![]() |
Citation:
Ce n'est pas forcément la même chose ... De plus, sans un index sur la clé primaire comment assurer l'unicité de cette clé ? |
|
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 887 ![]() |
Changer d'index cluster :
Soit T une table de clé primaire PK, composée des colonnes (C1, C2). Supposons que le SGBD (SQL Server en l'occurrence) ait d'office créé un index "primaire" X1 sur ces mêmes colonnes (C1, C2) et que cet index soit cluster. Supposons que nous voulions que ce soit un nouvel index, X2, claqué sur les colonnes (C3,C4) qui soit cluster. On peut soumettre en conséquence les instructions suivantes : ALTER TABLE T DROP CONSTRAINT PK ;Evidemment, si PK sert de référence pour une clé étrangère, il y a un peu plus de travail, mais le principe reste le même.
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 887 ![]() |
Citation:
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
|
00
|
|
|
#15 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 887 ![]() |
Citation:
Pour mémoire, jusqu'en 1988, DB2 ne nous permettait pas de déclarer des clés primaires et étrangères. Concernant les premières, nous garantissions l’unicité par le truchement des index de type UNIQUE. Pour les secondes, on faisait comme on pouvait, c'est-à-dire par programme. En juillet 1988, j’ai disposé de la version 2 de DB2, et enfin, avec l’instruction CREATE TABLE j’ai pu coder les clauses PRIMARY KEY et FOREIGN KEY, ce que nous attendions tous évidemment avec impatience. Mais j’ai pu constater qu’IBM ne s’embarrassait pas, en nous imposant un diktat injustifié consistant en la création obligatoire d’un index de type UNIQUE pour chaque clé primaire (la seule justification que je vois : "ça nous fera toujours du développement en moins"). J’estime que la décision de créer un index est du ressort de l’utilisateur et de lui seul (en l'occurrence le DBA). Si j’ai des tables qui occupent plus de 3 pages de données, je créerai un index. Pour la foultitude des petites tables de référence (du genre Pays, Départements, Catégorie juridique, code APE, titre de civilité, type de ceci, type de cela) qui tiennent en une page, il eut été préférable qu’IBM mît à notre disposition une routine ad-hoc, nous aurions fait l’économie d’une diarrhée de fichiers. En l’occurrence l’intégrité conceptuelle a été violée et nous le payons. Je cite et traduis Ted Codd, père du Modèle relationnel : Dans un contexte relationnel, les index sont des outils destinés à l'optimisation des performances et seront utilisés uniquement à cette fin... L'unicité des valeurs pour une colonne doit être spécifiée comme étant une propriété seulement de cette colonne et non pas celle d'un index. (E. F. Codd. The Relational Model for Database Management: Version 2 (Reading, Mass.: Addison-Wesley, 1990)).Peut être un jour assisterons-nous à l’envoi à la décharge de tous ces index, quand par exemple nous utiliserons le TransRelational Model de Steve Tarin pour optimiser l’accès aux tables. Je vous renvoie à ce sujet à l’ouvrage de C.J. Date : An Introduction to Database Systems, 8th edition. (Pearson: Addison-Wesley (International Edition), 2004).
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com