|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Bonjour,
Je viens de me documenter sur les index. Il me reste 2 questions : 1)Est-il (parfois) utile de créer des index sur les PK d'une table (ou une partie des champs si c'est une PK composite) 2)Quelle différence entre créer 4 index sur les champs A, B, C, D ou un index sur {A, B, C, D}. Merci. |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Le PK implique toujours l’index. Il est rarement utile d’indexer une partie des zones d’une clé primaire composite.
Si vous avez des requêtes qui filtre que sur la colonne A ou que sur la colonne B etc. vous avez peut être besoin d’un index sur A et un autre sur B, etc. L’index composite A, B, C, D est bon pour les requêtes qui utilisent des filtres sur l’ensemble des zones : A, B, C et D ou sur une partie de cet ensemble : A, B, C ou A, B ou A seul. Dans certaines cases l’index peut être utilisé quand A manque, ex : filtre sur B, C, D En conclusion, vos indexes sont déterminés par vos requêtes. Sur divers aspects concernant les indexes, voir aussi Richard Foote's blog |
|
|
10
|
|
|
#3 | ||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
La première colonne d'un index est cruciale. Par exemple pour couvrir précisément une requête du type:
Vous pouvez créer indifféremment un index sur (A,B) ou (B,A). Si on veut aller plus loin, je dirai qu'il vaudrait mieux mettre dans ce cas la colonne la moins répétitive (celle avec le plus petit nombre de valeur distinctes) en pôle position. L'index ainsi crée pourra éventuellement être très efficacement compressé réduisant sa taille et ainsi plus facilement logé dans le "data buffer cache" afin de limiter ses lectures physiques. Par contre, si en plus de votre requête précédente, vous avez une autre requête du type: Alors, il vaudrait mieux dans ce cas créer le premier index sur (B,A) et non sur (A,B). Vous pourriez ainsi économiser la création d'un index supplémentaire sur (B). Quant à la différence entre créer quatre indexes sur les champs A, B, C, D ou un index sur {A, B, C, D}, je dirai que l'index sur {A, B, C, D} couvrira les deux requêtes suivantes: Code :
Code :
Une autre remarque importante, admettons que vous avez une requête du type : Alors dans ce cas pensez bien à créer l'index sur (B,A) et ce quelque soit la cardinalité de A. En effet, il faut que la première colonne soit celle qui s'applique à l'égalité. Et voici ci-dessous un cas réél où la création d'indexes appropriés a permis d'améliorer la performance d'une requête http://hourim.wordpress.com/2011/12/...-explain-plan/ |
||||
|
|
10
|
|
|
#4 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
Je note donc que je dois repérer les critères dans l'ensemble de mes requêtes pour déterminer comment exprimer mes index (colonnes groupées si j'utilise régulièrement plusieurs colonnes en même temps, séparés si j'utilise tantôt l'une ou l'autre). Oui, ça je l'ai lu juste avant de poser ma question. J'étudierai aussi ça. Merci à vous deux. |
|
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
J'ai 3 autres questions
1°/ Si je fais un tri selon une colonne (sans clause where), est-ce TRES utile de créer un index? 2°/ Table : ApkFk, BpkFk, C, D, E Comme leur nom l'indique, j'ai une clé primaire composite {ApkFk, BpkFk } dont chaque champ fait référence à une table externe. Je vais un moment faire une requête sur cette table (jointure les 2 autres) où je filtre par critère sur -C -D ainsi que sur des propriétés de mes tables jointes. Que dois-je ajouter comme index : {C, D}? 3°/J'ai un index unique sur {A, B, C, D, E} La majeure partie du temps je recherche par {A, B, C, D} sauf dans certains cas où je recherche sur {A, C, D} + critère sur un champ de la table jointe par B --> dois-je remplacer l'index unique par {A, C, D, B, E} (inverser l'ordre)? |
|
|
00
|
|
|
#6 | |||
![]() ![]() |
Citation:
Si votre SELECT est couvert par un éventuel index, oui ça peut être intéressant. Si votre SELECT est plus du type "select *", alors ça n'aura aucun impact. Citation:
Un index supplémentaire sur B est envisageable pour valider simplement la Fk. Il peut être extrêmement contre-performant de trop multiplier les index : ils ont un coût de création, un coût de stockage, un coût dans les update / delete, un coût lors des rafraîchissement statistiques. Rappelez-vous que vous n'utiliserez qu'un seul index de type B*Tree pour accéder à une table. L'index (A,B) est utile pour Oracle afin de valider la contrainte de clef primaire, il n'est pas nécessairement utile à vos requêtes. Citation:
Si votre triplet (A,C,D) est très peu sélectif, Oracle pourra tout-à-fait décider ne de pas utiliser l'index. Vous pouvez vous en assurer via les plans d'exécution.
__________________
Email : http://scr.im/waldar |
|||
|
00
|
|
|
#7 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Merci.
Le point 2 n'est pas encore très clair pour moi : - Citation:
Dernière question : Si fonctionnellement il y a toutes les raisons d'ajouter un index unique sur plusieurs colonnes, doit-on toujours le rajouter ou est-ce qu'il faut aussi se poser la question? |
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Regarde Unindexed Foreign Keys
Si c'est fonctionnel, c'est donc nécessaire (évidemment si cette contrainte d'unicité n'est pas déjà une PK et donc que l'on utilise une PK auto incrémentée via une séquence) |
|
|
00
|
|
|
#9 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Désolé, encore 2 questions :
Quand j'ai demandé s'il faut toujours ajouter un index unique quand fonctionnellement cela correspond à quelque chose. Est-ce que ça ne rentrerait pas en contradiction avec ce que j'ai lu qui dit Citation:
|
|
|
|
00
|
|
|
#10 |
![]() ![]() |
Attention vous associez deux concepts qui sont pourtant distincts.
Si la règle fonctionnelle vous impose d'avoir un ensemble de colonnes uniques, ce n'est pas un index qui vous faut mais une contrainte d'unicité. Ce que fait Oracle derrière pour valider cette dernière, dans une certaine mesure, n'est pas important, même si effectivement il s'appuie sur un index.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#11 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Euh...un index unique n'est pas un index? Les règles d'ordre des champs n'a plus de rapport avec le fonctionnement d'un index? Un index unique sur {A, B, C, D} alors que des fois on filtre sur B & D ne serait-il pas mieux écrit en {B, D, A, C}?
Si index unique et index n'ont aucun rapport, est-ce qu'il faut comprendre qu'il peut être utile de créer des index EN PLUS de l'index unique? *********** Sinon en lisant encore d'autres docs, je tombe sur la fusion d'index. En-dessous de 5 index, il ne semble finalement n'y avoir aucun intérêt à créer un index sur {A, B, C, D, E} puisque si on en crée 5 distincts et qu'on a des clauses sur A, B, C ou A, D, E, ça semble théoriquement être plus performant par fusion des index distincts nécessaires que par un index multiple à l'ordre figé.? |
|
|
00
|
|
|
#12 | ||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Je récapitule pour vous les principaux points soulevés par les différents intervenants :
Par exemple, pour couvrir Code :
il serait plus intéressant dans ce cas de créer un index sur (a,c,b) et ce, quelle que soit sa nature unique ou pas unique. Citation:
Je vous conseille vivement (comme l'a déjà fait marius) de lire le site suivant: http://richardfoote.wordpress.com/ Vous allez trouver toutes les réponses à toutes vos questions. |
||||
|
|
10
|
|
|
#13 |
![]() ![]() |
Je ne pense pas avoir écrit cela.
Je vous disais juste de ne pas confondre "valider une règle fonctionnelle" qu'on réalise avec une contrainte d'intégrité, et "améliorer les performances d'une ou d'un ensemble de requêtes" qu'on réalise en posant des index.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#14 | ||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
je n'ai pas encore le recul (les connaissances) pour avoir un oeil critique sur ce que je lis. Pour info (page 13) : http://www.cocktail.org/gedfs/courri...df?wgtg=_blank Citation:
Citation:
|
||
|
|
00
|
|
|
#15 | |
![]() ![]() |
Citation:
De plus dans les bases OLTP, les données arrivent petit à petit, des millisecondes multipliées par trois ou quatre restent des millisecondes. Si votre base de données est décisionnelle (OLAP), vous pouvez être plus laxiste dans vos contraintes, puisque vos données sont déjà validées par des bases OLTP positionnées en amont, et qu'en cas de problème il y a toujours un moyen de recharger les données. Ici les chargements sont ensemblistes et il est très courant, sur les transactions à fortes volumétrie, de désactiver les contraintes, rendre les index inutilisables, charger les données, réactiver les contraintes et reconstruire les index.
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Je suis dans le cas OLAP donc (je découvre les acronymes), avec des gros fichiers à intégrer d'une part et des données restituées d'autre part (d'où mes recherches pour optimiser la lecture sans ralentir les intégrations).
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com