|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Inscription : juin 2007 Messages : 32 ![]() |
Bonjour
Je suis débutant et je travaille sous oracle 9i Personal Edition V9.2.0.1. Afin d’optimiser le temps d’exécution de certaines requêtes comme : Code :
Code :
Merci . |
||||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
|
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 450 ![]() |
Je ne connaissais pas ce genre d'index
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 32 ![]() |
Bonjour
Les index bitmap de jointure (appelés aussi index de jointure binaires) sont les plus appropriés aux entrepôts de données, c'est ceux là que je dois créer; je n'ai pas le choix. Merci quand même! |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 32 ![]() |
J'ajoute un petit quelque chose.
Les index bitmap de jointure sont intersessants car ils accelèrent l'exécution des requêtes qui font intervenir des opérations de jointure qui sont les plus coûteuses dans les entrepôts car elles opèrent sur une table faits très volumineuse et des tables dimensions de taille moins importante. Dernière chose, vous pouvez aller voir ça http://articles.techrepublic.com.com...2-1051931.html Cordialement. |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Pour analyser complètement un problème de performance, il faudrait avoir le maximum d'éléments de la liste suivante:
Je ne connaissais pas non plus les bitmap join index qui existent depuis la version 9 et qui sont très peu référencés dans les forums OTN. (idem sur AskTom). |
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Citation:
Avez-vous lu certains chapitres du Concepts Guide et du Performance Tuning Guide ? |
|
|
|
00
|
|
|
#8 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 32 ![]() |
Ce que j'utilise n'est qu'une base de données tests.
Au fait je suis en train de travailler sur un outil de sélection d'index. Mon application exploite le fichier log d'une base pour en extraire les attributs les plus fréquemment utilisés dans les clauses: where, group by et having pour proposer des index. Ces attributs sont obtenus en faisant appel à une technique de data mining qui est l'extraction des itemset fermés fréquents. Ce travail a déjà été fait mais dans un cadre statique. Mon application utilise un algorithme d'extraction incrémentale d'itemset, ce qui rend mon application dynamique (c'est à dire qu'elle prend en compte l'évolution du log). Arrivée à la phase expérimentale, et je me rends compte que les index bitmap de jointure ( c'est ceux -là que je dois créer) ne sont pas utilisés pour la résolution de mes requêtes.Pourtant, lorsque je crée d'autres types d'index, je remarque qu'ils sont utilisés!!! |
|
|
00
|
|
|
#9 |
|
Membre confirmé
![]() Inscription : août 2005 Messages : 270 ![]() |
Bonjour,
Tu n’es jamais "obligé" de faire quoi que ce soit. Ta requête est une requête particulièrement simple qui met 2 tables en jointure. Bref, typique d'une optimisation avec des boucles sur un index btree ou du hash join ou autre. Des index bitmap sont utiles quand tu as une table de "faits" autour de laquelle gravitent des tas de dimensions peu discriminantes prises isoléments. Quand une requête porte sur plusieurs dimensions "bitmapées" , l'optimiser peut effectuer des opérations de sélection sur les bitmap. D'ailleurs, le lien que tu donne utilise une requete avec 2 critères de recherche. Remarque : la maintenance des index bitmap, c'est lourd... Bref, c'est tout sauf le cas que tu présente me semble t il. Les index bitmap ne sont pas adaptés à ta requête. Tu n'est donc pas "obligé" d'utiliser des index bitmap, il me semble plutôt qu'il est souhaitable que tu utilise des index btree. Si ta base est une base de test avec des volumes et des « discriminances » de données non significative, le plan d'exécution n'est pas forcement représentatif de ce qui se passera en prod. @+ |
|
|
00
|
|
|
#11 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Un index de jointure bitmap ne peut être intéressant que si 2 conditions sont réunies :
- Jointure avec une table référenciel qui ne bouge JAMAIS (et à mon avis, c'est même mieux qu'aucune des 2 tables n'évoluent parce que les mises à jour doivent faire très mal - tu as une cardinalité très faible (peu de lignes dans une table par rapport à l'autre). Si tu ne remplies pas ces conditions, tu fais un index de jointure B-Tree. En plus, tu violes la restriction de l'article que tu nous proposes puisque tu ajoutes une condition au WHERE. C'est pour ça que tu ne peux pas utiliser l'index Citation:
Conclusion : il NE FAUT PAS que tu utilises le bitmap... CQFD
|
|
|
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
l'exemple est tiré de la doc, c'est le genre d'exemple typique en DW où l'on employe un bitmap index de jointure.
Est-ce que tu as les droits QUERY REWRITE? Sinon ensuite quels sont tes paramètres query_rewrite_enabled et query_rewrite_integrity ? A+ Laurent |
|
00
|
|
|
#13 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
Code :
|
||
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
C'est testé en 9.2.0.1 ?
|
|
|
00
|
|
|
#15 | ||
|
Invité régulier
![]() Inscription : juin 2007 Messages : 32 ![]() |
Bonjour,
La restriction dont il est question dans l'article que je vous ai proposé porte sur les attributs qui figurent dans la clause where. Ma requête ne fait intervenir dans celle-ci que des attributs figurant dans l'index Le plan d'exécution que j'obtiens m'informe que les tables Sales et times ont été utilisées ainsi que 2 index B-tree que le système a crés pour les deux table sur leurs clés primaires. Je conviens sur le fait que l'exemple que j'ai pris est simple et qu'il nécessite pas un index bitmap de jointure, les autres requêtes de ma charge sont plus compliquées que ça Code :
Merci beaucoup. cordialement, Pandore |
||
|
|
00
|
|
|
#16 | |||||
![]() ![]() Gilles ROUARDAdministrateur de base de données Inscription : mars 2003 Messages : 220 ![]() |
Bonjour à tous,
Pandore1983, as-tu généré les statistiques dans ton exemple ? En effet, si je créée la table TIMES avec sa PK, et la table SALES avec son bitmap join index, voici ce que j'obtiens sans les stats (test réalisé sur une base Enterprise Edition 9.2.0.6.0) : Code :
Maintenant, si je génère les statistiques, et que je regarde à nouveau le plan d'exécution : Code :
Pour finir, je pense personnellement que Pandore1983 a raison d'utiliser les bitmap join index (ou au moins les bitmap index). N'oublions pas qu'il travaille sur un entrepôt de données, sur un modèle en étoile (au moins 3 tables de dimension CUSTOMERS, PRODUCTS, TIMES) et SALES comme table de fait. Sur ce genre de modélisation, les requêtes, qui sont souvent des aggrégats comme le prouve le dernier exemple de Pandore1983, sont performantes si elles ont un plan d'exécution en Star Query (requête étoile). Cela veut dire : 1) des tables de dimension possédant des PK, 2) une table de fait sur laquelle on pose des index bitmap sur les ID. Voir aussi selon ses besoins si l'on pose des bitmaps join index, 3) des contraintes de FK posées de préférence en VALIDATE, ENABLE et RELY. Maintenant, si la vérification des FK est trop contraignante, ou trop lente, on peut les passer en DISABLE et NOVALIDATE, 4) des statistiques calculées sur les tables et ses index, 5) un plan d'exécution en Star Query. Il faut alors peut-être faire un : Citation:
|
|||||
|
|
00
|
|
|
#17 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
Citation:
|
|
|
00
|
|
|
#18 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 32 ![]() |
Bonjour tout le monde
Oui j'ai du générer les statistiques pour affichier le coût dans mon plan d'exécution. J'ai aussi activé les transformations en étoile car sans ça, l'index bitmap ne sera pas utilisé. Mais j'obtiens toujours le même plan |
|
|
00
|
|
|
#19 |
![]() ![]() Gilles ROUARDAdministrateur de base de données Inscription : mars 2003 Messages : 220 ![]() |
Pandore1983,
Ce serait bien que tu nous donnes ton plan d'exécution, et que tu nous donnes qq idées sur la cardinalité des lignes attendus. En effet, ce n'est pas parce que tu as activé l'option des requêtes étoiles, que le plan d'exécution va coller à cette option. En effet, l'optimiseur Oracle calcule d'une part le coût pour un plan en étoile, et d'autre part calcule aussi le coût pour un plan classique. Au final, il retiend le meilleur des 2. Si tu ne vois pas l'utilisation de ton bitmap join index, c'est peut-être parce qu'il n'est pas assez sélectif. En fait, il faudrait savoir combien il y a de lignes au total dans SALES, et combien de lignes répondent au critère Année Fiscale = 2000. Idem pour la table TIME : combien de lignes au total, et combien de lignes répondant au critère Année Fiscale = 2000 ? |
|
|
00
|
|
|
#20 | ||||||||||
|
Invité régulier
![]() Inscription : juin 2007 Messages : 32 ![]() |
Bonjour
Code :
Le plan d'exécution (pour le premier exemple) que j'obtiens lorsque je force l'utilisation de mon index est Code :
Sans forçage j'obtiens Code :
Pour le dernier exemple , j'ai construit l'index et j'ai obtenu ce plan: Code :
Avec forçage Code :
Je n'ai jamais pensé qu'une requête comme cette dernière pourrait être résolue plus efficacement en utilisant autre chose qu'un index bitmap de jointure. Merci beaucoup |
||||||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com