|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | |||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Citation:
Code :
Code :
SELECT count(*), count(case Id_TYPE_DOCument when 150 then 1 end) FROM document ==> 101073 La question est : Comment savoir à l'avance combien de lignes la requete va renvoyer ? Faire un count coute quasiment aussi cher que ramener les lignes. Voyez vous un un moyen de résoudre cette problématique ? Par exemple, est il possible d'interroger dans un programme Java le plan d’exécution d'une requête ou bien les données statistiques ? |
|||
|
|
00
|
|
|
#22 |
|
Membre chevronné
![]() François Inscription : février 2010 Messages : 394 ![]() |
Perso, je tenterai bien un index sur documents(id_type_document,id_sous_dossier) au lieu de l'index sur documents(id_type_document).
Pour le requetes ou le numero de type_document est peu present, on aurait le meme effet. Et pour les requetes genre celle ou vous avec id_type_document=10 qui renvoie tout plein de resultats, ca permettrait peut-etre d'utiliser l'index, en un "fast full-index scan" vu que toutes les infos seraient dedans. Parce que la concretement, il peut pas l'utiliser pour id_type_document=10. Edit:Et d'ailleurs, tant qu'on y est: SOUS_DOSSIER(ID_PENSIONNE,ID_SOUS_DOSSIER )Mais pour l'ordre des colonnes, la je suis pas tres convaincu. Mais bon, visiblement c'est pas ca qui prends du temps, ce qui est marrant d'ailleurs... |
|
|
00
|
|
|
#23 |
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Merci pour cette piste.
Cependant, j'ai créé l'index documents(id_type_document,id_sous_dossier), mais cela ne change rien au plan d’exécution : ce nouvel index n'est pas utilisé. |
|
|
00
|
|
|
#24 | |
|
Membre chevronné
![]() Mohamed HouriInscription : mars 2010 Messages : 402 ![]() |
Citation:
http://jonathanlewis.wordpress.com/category/philosophy/ Que je viens de traduire à l'instant Traduction Si vous exécutez une requête qui est supposée retourner un seul enregistrement à partir d'une très large table, et, vous disposez d'un index approprié sur cette table, vous vous attendrez probablement à ce que l'optimisateur d'Oracle identifie l'index et qu'il l'utilise. Si vous changez votre requête de telle sorte qu'elle renvoi tous les enregistrements de cette table (sans tri) vous vous attendrez probablement à ce que l'optimisateur d'Oracle choisisse un full table scan. Ceci conduit à la très simple idée qui est souvent ignorée "Quelques fois il suffit juste d'un enregistrement supplémentaire pour passer d'un plan d'exécution utilisant un index à un plan utilisant un full table scan" Il existe un point où l'optimisateur change d'un accès indexé à un seul enregistrement vers un accès à toute la table pour tous les enregistrements. Si vous êtes assez chanceux et le modèle de l'optimisateur est parfait il n'y aura aucun effet significatif sur la performance, bien sûr. Mais, nous ne sommes pas aussi chanceux que ça, et c'est pour cette raison que les gens finissent par poser la question : 'Comment le plan d'exécution est devenu subitement non performant, il n'y a eu aucun changement .... sauf pour un petit supplément de données?". Tout ce qu'il faut c'est un seul enregistrement (que l'optimisateur reconnait) pour changer d'un plan d'exécution à un autre- et parfois l'optimisateur trouve le mauvais moment pour opérer ce changement.
__________________
Bien Respectueusement www.hourim.wordpress.com "Ce qui se conçoit bien s'énonce clairement" |
|
|
|
10
|
|
|
#25 |
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Je reformule ma question : Est il possible dans un programme (java ou autre) de connaitre le nombre de lignes qu'une requête va ramener, mais sans exécuter la requête (ie en se basant sur les statistiques) ?
|
|
|
00
|
|
|
#26 |
|
Membre chevronné
![]() Mohamed HouriInscription : mars 2010 Messages : 402 ![]() |
Si tant est que cela soit possible, comment être sûr dans ce cas que les statistiques sont à jour????
Je ne pense pas que ce que vous proposez soit possible. Il faudrait plutôt se concentrer sur l'amélioration de votre requête. J'ai une question quand même : Est-ce que le client se plaint de la performance parce qu'il s'est habitué à voir cette requête s'exécuter rapidement ou bien c'est du premier coup qu'il s'est plaint de la performance?
__________________
Bien Respectueusement www.hourim.wordpress.com "Ce qui se conçoit bien s'énonce clairement" |
|
|
00
|
|
|
#27 |
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Le client est en phase de recette de cette application, et considère comme une anomalie les temps de réponse de ce cas d'utilisation.
Il accepterait que le système renvoie un message à l'utilisateur lui précisant que le résultat de sa recherche va dépasser les 100 réponses et lui demandant d'affiner ses critères de recherches (sans que la recherche soit effectivement faite). En ce qui concerne la validité des statistiques, ne sont elles pas maintenues à jour en permanence par Oracle ? |
|
|
00
|
|
|
#28 |
|
Membre chevronné
![]() Mohamed HouriInscription : mars 2010 Messages : 402 ![]() |
Ce n'est certainement pas une nécessité ni une règle que la jointure HASH JOIN se fasse toujours via un FULL TABLE SCAN. Jonathan Lewis dans son livre Cost Based Oracle Fundamentals au Chapitre 12, Hash Join, page 321, parle(par l'exemple) justement de cette pas toujours vraie règle mais néanmoins largement répandue dans le monde Oracle
__________________
Bien Respectueusement www.hourim.wordpress.com "Ce qui se conçoit bien s'énonce clairement" |
|
|
01
|
|
|
#29 | |||
|
Membre chevronné
![]() François Inscription : février 2010 Messages : 394 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#30 | ||
![]() ![]() |
Il faut bien définir votre besoin.
Si votre seuil d'affichage est de cent lignes, la première requête que je vous ai donné peut répondre rapidement : le calcul du tri avait un certain coût. On peut aussi envisager un hint - je ne suis pas certain de l'impact cela dit : Code :
En y réfléchissant, même avec le type 150 vous arrivez à 13.000 lignes, il faut repenser votre besoin je pense.
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#31 | ||
|
Expert Confirmé
![]() Inscription : août 2008 Messages : 1 690 ![]() |
En soit ça ne me choque pas que la requête puisse ramener dans les 100 000 lignes tant qu'elle est paginée pour ne fetch que 100 lignes.
Après je ne vois pas pourquoi essayer de conserver la requête très innéficace d'hibernate. En effet DISTINCT + LEFT JOIN avec filtre WHERE sur la table en LEFT JOIN (ce qui revient à faire un INNER JOIN...) montre que cette requête ne convient pas du tout. Il faut partir de la requête de Waldar (hibernate peux executer des requêtes directement) et regarder son plan. Il peut être intéressant de faire une trace level 12 + TKPROF pour voir ce qui se passe car apparemment le FULL SCAN de DOCUMENTS est qu'en même très lent. Sinon j'utiliserais bien aussi le hint FIRST_ROWS(N) dans la requête de Waldar (de toute façon ça fournie juste plus d'info à l'optimiseur, ça ne fait donc pas de mal): Code :
Juste un point, il me semble que tu disais que tu étais en recette, le serveur de recette est il ISO future PROD ? notemment concernant les disques. |
||
|
|
10
|
|
|
#32 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 424 ![]() |
Salut,
Je suis bien d'accord avec toi Waldar. Cela dit ce n'est pas forcément le besoin qui est mal exprimé, ça peut très bien être le modèle ou le "process". Finalement, on voit souvent ce genre de problème : ton modèle est totalement normalisé, et tes critères de recherche (sans dépendances) sont éparpillés. T'es obligé de faire une VM comme le suggère Skuat. La seule question qui reste c'est : est-il rationnel de faire une recherche sur la possession d'un type de document ? Quel est la fréquence d'une telle recherche ? - Si c'est un cas d'exception, 50 secondes ne sont vraiment pas choquantes. - Si c'est le quotidien du chargé, il faut faire une VM, et surtout se demander pourquoi on doit sortir en interactif la liste des gens qui ont eu un certain type de document...
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#33 | ||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Un grand merci à tous pour vos réponses pertinentes.
Je vais tester les différentes solutions/approches proposées et vous ferais un retour. Concernant les différentes questions posées : Citation:
Citation:
|
||
|
|
00
|
|
|
#34 | |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 424 ![]() |
Citation:
A quoi ça sert ? Dans quel contexte ? Est-ce vraiment ce qu'on cherche dans notre process ? Notre process est-il bien design-gné ? => Ca a l'air intéressant en tant que MOA, non ?
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
|
00
|
|
|
#35 | |||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#36 |
|
Expert Confirmé Sénior
![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 4 104 ![]() |
Deux parse un execute ce n’est pas bon mais ça c’est une autre histoire.
Sinon ça va tellement vite sauf que apparemment ça n’a rien ramené (rows = 0). Mais, il se peut aussi que la session n'a pas été fermée et que les statististique ne sont pas disponible. |
|
|
00
|
|
|
#37 | |||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#38 |
|
Expert Confirmé Sénior
![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 4 104 ![]() |
Bref, on y voit la même chose :
|
|
|
00
|
|
|
#39 | ||||||||
|
Membre chevronné
![]() Mohamed HouriInscription : mars 2010 Messages : 402 ![]() |
Code :
Code :
Dommage que le plan d’exécution n'a pas été inclus dans cette trace. Si vous n'êtes pas satisfait par le temps de réponse il faudra faire une optimisation manuelle comme l'a fait Jonathan Lewis dans un contexte qui ressemble un peu au votre mais où pour lui c'était l'opération ORDER BY qui posait le plus problème ce qui n'est pas votre cas ici. http://jonathanlewis.wordpress.com/2...l-optimisation En rédigeant ces quelques lignes j'ai revu votre requête et il me semble que la jointure externe suivante Code :
Code :
__________________
Bien Respectueusement www.hourim.wordpress.com "Ce qui se conçoit bien s'énonce clairement" |
||||||||
|
|
00
|
|
|
#40 |
|
Expert Confirmé
![]() Inscription : août 2008 Messages : 1 690 ![]() |
Juste pour te donner quelques liens qui peuvent t'intéresser :
db file sequential read Et sur asktom, pour quelques pistes de reflexions : Wait event: DB file sequential read Mohamed, Il a utilisé la requête de Waldar, il est donc impossible de comparer le tkprof avec les précédents plans. jalaval, normalement le tkprof devrait contenir le plan réel dans la section Row Source Operation, sinon regénère un plan pour cette requête, par contre on a l'air loin des 25s dont tu parlais. |
|
|
10
|
Copyright © 2000-2013 - www.developpez.com