|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Oracle (important car dans mes recherches, les gens parlent d'index, etc mais on ne sait pas toujours si ça s'applique à tous):
1)création d'une PK implique index implicite (qui n'apparaît pas dans le script de la table) / même question pour un unique constraint (un index unique EN PLUS a-t-il un intérêt, et d'ailleurs inversement la création d'un index unique empêche-t-il la duplication des champs "uniques"...comme une unique constraint) ? -->ici, on trouve une chose et son contraire suivant la source où on a vu l'info! 2)Un index sur une colonne d'une table qui possède une FK sur une autre table joue-t-il dans la performance des jointures faites entre ces 2 tables? 3)Réunit les questions 1&2 L'ordre des champs dans une PK composite est-il important (j'imagine que la réponse est conditionnée par ma question1) --> exemple {A, B} mieux que {B, A} quand on recherche/joint plus souvent par A} ---> et si PK = {A, B} et qu'on cherche aussi bien par A seul que B seul, doit-on ajouter un index sur B uniquement 4)A partir de quelle taille un index est-il utile? 5)Faut que j'arrête de lire des trucs, j'ai lu qu'un index {A, B, C} sera moins performant qu'un index {A, B} si on ne cherche que sur A et B --> si on cherche sur {A, B, C} et {A, B}, doit-on créer les 2 index? |
|
|
00
|
|
|
#2 | ||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Citation:
A lire : http://sqlpro.developpez.com/cours/quoi-indexer/#LIV Citation:
Un index UNIQUE est l'équivalent d'une contrainte d'unicité. MAIS...
Citation:
Pour la table fille, en indexant en sus les colonnes de la FK dans la même composition que la clef de référence, alors vos jointures auront un coût tout à fait négligeable... Dans mes cours je m'amuse à faire calculer à mes élèves le cout d'une jointure de 30 tables de 100 millions de lignes distincte dont la jointure se fait sur un entier... Vous verrez qu'il est tout à fait négligeable, si les deux côtés de la jointure sont pourvus d'index (exactement 180 pages à lire). En revanche, sans index d'un seul côté, on passe à 4 500 000 pages ! Autrement dit sans index d'un seul côté, la requête est 25 000 fois plus longue... Une paille ! Citation:
Si votre clef primaire est Col1 ASC, Col2 DESC, Col3 ASC et que l'index de votre FK est Col1 ASC, Col2 ASC, Col3 ASC alors il n'est pas possible d'utiliser les index pour résoudre avec vélocité la jointure. La composition doit porter : 1) sur les mêmes colonnes et en même nombre 2) sur la même position ordinale 3) sur le même sens de tri Pour ce qui est des recherches... l'index {A, B} est dit inclus dans l'index {A, B, C} (vectorisation des informations) on peut donc s'en séparer, mais parfois, notamment si C est une donnée très longue, ces deux index peuvent avoir chacun leurs avantages. En revanche, l'index {B, A} n'est pas inclus dans l'index {A, B, C}... Enfin, plus un index est long, moins il est efficace. En effet (et sauf exception) un index sur une colonne de 250 caractères a peu de chance de servir à quoi que ce soit, car pour trouver une ligne à partir d'une valeur dans une colonne d'une table, il faut une série de caractères identiques. Plus la saisie est longue et plus l'utilisateur à des chances de se tromper ou de saisir une autre version du littéral, ce qui ne servira donc à rien. Exemples :
Lisez les articles que j'ai écrit sur ces sujets, notamment : 1) Tout sur l'index (1ere partie) 2) Indexer avec SQL... oui mais quoi ? 3) Est-il bon de ne pas avoir d'index ni de clef dans une table ? 4) Indexation... une étude par l'exemple Ne lisez par n'importe quoi... Les sites les plus populaires ne sont pas toujours les mieux renseignés... 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
|
|
|
#3 | |||||||
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour,
Citation:
Citation:
Oui, un index unique suffit pour empêcher les doublons. Mais c'est une solution plutôt physique: on ne peut pas stocker des doublons, donc on les empêche. Si la modélisation définit une unicité, alors il est logique de créer une contrainte. C'est plus clair pour celui qui lit le modèle de données. elle peut être référencée par une foreign key. Puis l'implémentation de la contrainte peut créer un index unique sur ces colonnes, ou s'appuyer sur un index existant (pas forcément unique, pas forcément dans le même ordre, pouvant avoir d'autre colonnes en plus) Citation:
Citation:
Citation:
Citation:
Citation:
Et attention: - une contrainte d'intégrité ne sert pas seulement à empêcher les doublons. C'est la déclaration en base de donnée des cardinalités et l'optimiseur utilise ses informations précieuses lorsqu'il établit un plan d'exécution - un index ne sert pas seulement à optimiser un accès. Avoir les foreign key comme préfixe d'un index permet d'éviter qu'un delete (entre autres) de la table parent ne vérouille toute la table fille Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|||||||
|
00
|
|
|
#4 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour SQLpro,
Citation:
S'il s'agissait de ramener 1000 lignes de chaque table, l'accès par index serait une catastrophe. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#5 |
![]() ![]() |
1000 lignes sur 100 millions, je pense que l'index est encore largement efficace !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#6 | ||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
C'est très bien de prendre le temps et toute la pédagogie nécessaire pour expliquer des concepts Oracle comme que vous venez de le faire.
Citation:
L'indexation de la FK n'est pas uniquement utile pour des raisons de performance. Je dirai même qu'elle est avant tout primordiale dans un environnement OTLP afin d'éviter des locks et des deadlocks lorsque des delete/update/merge sont faits sur les tables mères (parent table). Quant à la définition de cette FK je suis d'accord avec le fait que toutes les colonnes de cette FK doivent figurer dans l'indexe qui la couvre. Par contre, il n'est vraiment pas nécessaire que l'ordre des colonnes dans l'indexe doive coïncider parfaitement avec celui défini dans la contrainte FK. Il suffit que l'index commence par la composition des colonnes de la FK mais dans n'importe quel ordre ; ceci permettra de couvrir la menace des locks et deadlocks. Pour la performance, comme la jointure se fait sur toutes les colonnes de la FK, l’index de la FK, sera éventuellement utilisé par le CBO (Optimisateur d’Oracle) pourvu que cet index commence par les colonnes de la FK et dans n’importe quel ordre. J'ai résumé l'explication ci-dessous dans le simple article suivant: http://hourim.wordpress.com/2011/02/...-foreign-keys/ Citation:
|
||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour Mohamed,
Je ne vois pas pourquoi l'ordre changerait quelque chose pour la jointure. Ce qu'il faut, c'est que l'index puisse ramener le minimum de lignes correspondant au prédicat. C'est pour cela qu'il est important qu'il couvre toutes les colonnes. Mais son sens de tri ne concerne que les tris, pas les accès. Sauf peut-être pour un SORT MERGE JOIN qui ne pourrait pas utiliser l'index pour pour trier... Mais c'est bien de tester... peut-être l'occasion d'ouvrir un bug de plus sur les function Based index puisque c'est comme ça qu' Oracle implémente les colonnes descending. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
00
|
|
|
#8 | ||||||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Tout d'abord merci à tous; c'est incroyable de voir toutes ces personnes qui prennent le temps d'aider les autres!
![]() Citation:
et dont on fait une jointure dans une requête entre ces 2 colonnes d'entier (qui ne sont indexées ni par PK ni par FK)? Si oui, je comprend que ça fonctionne mal, sinon j'ai mal saisi la subtilité de l'exemple. Citation:
J'ai donc lu que si rien n'est précisé, c'est "asc" par défaut. Je suis un peu perdu mais dans cet exemple si on ne crée que la PK, on va avoir un index implicite (Col1 ASC, Col2 DESC, Col3 ASC) si j'en crois ce que me dit pachot ("PK implique unicité. (...) soit un index comme cela existe déjà, soit il est créé implicitement") et ce que vous dites c'est qu'on ne pourra pas créer un index sur partie ou totalité de ces champs? Pourtant j'ai dans ma base des exemples avec PK = {A, B} et en plus un index sur A --> il sert à rien? Citation:
---------------- Citation:
PK {A, B} génère implicitement l'index {A, B} et que si on cherche plus souvent par B, il faudrait ajouter l'index explicite {B, A} alors que si on cherche aussi bien par B ou par A il ne restera qu'à ajouter un index sur {B} Et au passage, admettons que j'ai une PK sur {A, B} et 2 index : un sur A et un sur B (parce que les personnes qui ont généré la base l'ont fait comme ça). Est-il intéressant de nettoyer l'index inutile sur A (ou ça ne change rien)? Citation:
Intéressant la sélectivité : dans le cas d'une table de 10.000 lignes avec un flag 'V' ou 'F' dans une colonne (disons 50% / 50% par exemple), on n'a donc pas d'intérêt à y mettre un index dessus? Citation:
|
||||||
|
|
00
|
|
|
#9 | |||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
Quant au tri (col1 desc, col 2 asc, col3 desc ) des colonnes dans l'index sensé couvrir la FK, je dirai que dès que ce genre de tri est inclus dans l'index ce dernier devient un "Function Based Index". Sachant que ce type d'indexe(et les bitmap index aussi) ne nous protège pas de la menace des locks et des deadlocks, il faut donc créer un index du type B-tree commençant par les colonnes de la PK dans n'importe quel ordre (position) |
|||
|
|
00
|
|
|
#10 | ||||||
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour,
Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
Là, l'ordre est important. Un index B,A ne peut pas être utilisé pour cela. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
||||||
|
10
|
|
|
#11 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
|
|
|
|
00
|
|
|
#12 | |||||||||||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
J'ai une table TITI (TITIIDT, TUTUIDT, VALUE2) -->je veux savoir si un index sur le champ TITIIDT de ma table TOTO va améliorer les performances de ma jointure Ma requête : Code :
Code :
Code :
Par contre absolument 0 différence sur la simple requête (idem mais sans filtre sur un champ de la table TITI): Code :
Code :
|
|||||||||||
|
|
00
|
|
|
#13 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
-un pour l'aspect logique (modélisation) -un pour les performances de recherche |
|
|
|
00
|
|
|
#14 | |||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
Créons maintenant un index B-tree (très important B-tree) et voyons ce qu'il advient de notre delete Code :
J'espère que c'est clair. |
|||||
|
|
00
|
|
|
#15 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Citation:
Mais s'il y a un autre utilisateur qui veut ajouter un enregistrement fils, mais qui n'a pas encore terminé sa transaction, alors on ne le verra pas. Et lui ne verra pas notre delete en cours non plus - il croira que l'enregistrement père est toujours là. c'est le principe de l'isolation des transactions. C'est pour cela qu'il faut poser un verrou: - le premier pose un verrou et fait son opération - le deuxième essaie de poser un verrou et attend - si le premier commit, alors le deuxième reçoit une erreur de violation de contrainte - si au contraire il rollback, alors le premier peut continuer
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
C'est un index classique B-tree non ?
Ma base est en mode Row Lock; est-ce que cette explication sur l'utilité des index sur les FK du coup ne me concerne plus du tout? |
|
|
00
|
|
|
#17 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Citation:
Il faut poser un verrou pour empêcher des modifications concurrentes incompatible et c'est l'index sur la FK qui offre la structure qui évite de vérouiller toute la table.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#18 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
2°/J'ai un cas où j'ai un index unique sur {A, DATE, C, D, E} Souvent je cherche par {A, trunc(DATE)}, d'autres fois par {A, trunc(DATE), C}. Actuellement j'ai les index {A, DATE} et C en plus de l'index unique; utile ou pas (sachant que C a une FK)? (pour les trunc, je sais que ça ne passe pas par l'index donc faut que je vois si on peut limiter ça...vu que c'est une date sans heure) 3°/Soit 4 colonnes {A, B, C, D, E, F} Il m'arrive de chercher en filtrant par {B, C, D, E} dans certaines requêtes d'une part, mais d'autre part comme B, C, D et E ont des FK vers d'autres tables et qu'on fait des jointures dessus, je me demande si dans ce cas il vaut mieux créer 4 index distincts plutôt que {B, C, D, E} 4°/Enfin, pouvez-vous me confirmer que ce que j'ai dis dans les post #12 et #13 est exact? merci. |
|
|
|
00
|
|
|
#19 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Refaite votre exemple avec deux vrai sessions et vous allez constater un inter-blocage c’est sur mais, pas un deadlock !
|
|
|
00
|
|
|
#20 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Bon, promis mon dernier post (ci-dessus #18) sera le dernier et après je ferme le sujet
Enfin bon un petit dernier avant de partir : 5)J'ai un index unique sur {A, B, C, D, E} J'ai choisi cet ordre pour les critères de tri de fréquence décroissante...mais je me pose la question sur D qui est utilisée fréquemment pour faire des jointures avec une autre table. Pffff, pas facile... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com