|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 305 ![]() |
Bonjour,
J'ai plus ou moins cette situation: Mon programme parcourt plein plein plein de fois la même table pour récupérer une valeur sur laquelle il y a un index. Et il connait avant de faire le select, l'ensemble des valeurs qu'il va devoir récupérer. Code :
Code :
Code :
Citation:
![]() Mais comme c'est quand même un ordre de grandeur plus rapide que mes autres solutions... Auriez-vous une idée pour faire la même chose sans la table temporaire ? Parce que que concrètement, c'est plus rapide avec la table simplement grâce au bulk collect, mais je ne trouve pas d'idée pour utiliser le bulk collect sans la table temporaire. Genre un equivalent de forall mais avec un select? |
|||||||
|
|
00
|
|
|
#2 | ||||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut !
Et tu ne peux pas plutôt mettre ton tmp2 sous forme de tableau ? Et surtout ce truc là, c'est juste un exemple bidon ? Code :
Code :
__________________
(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
|
|
|
#3 | ||||||||||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Sinon il est possible de faire créer une table temporaire à la volée par oracle en lui demendant de materialiser les lignes, ce qui peut être plus performant (Sans hint l'optimiseur est libre de choisir ou non de matérialiser): Code :
Code :
D'ailleurs si on utilise des fonctions SQL les perfs sont plus proches : Code :
Bon la différence n'est pas énorme mais si besoin, il est possible d'améliorer les perfs liées à ce changement de contexte en passant par une fonction pipelined. Code :
Code :
Citation:
L'utilisation du hint dynamic_sampling pourrait améliorer l'estimation, mais pour l'instant je n'ai pas trouvé comment... |
||||||||||||
|
|
20
|
|
|
#4 |
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 305 ![]() |
Bonjour,
Oui tmp2 est une table de test. Mais c'est gentil d'avoir propose cette solution Pour le changement de contexte, ce sont les cas de test1 et test2. Et en effet, le test2 est bien plus rapide. La function pipelined ne va pas m'aider dans le cas present. En fait, j'ai une liste de valeur en java, et je veux recuperer toutes les donnees correspondantes. Je peux passer les valeurs soit une par une (beurk), soit genre une List. Et c'etait ca le principe de la question:
A defaut, je vais garder la table temporaire. Parce que la pipelined function ne correspond pas a mon cas. Merci en tous cas |
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Il y a encore
Code :
|
||
|
|
31
|
|
|
#6 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
[edit] Ah oui la proposition de mnitu me semble très intéressante |
|
|
|
10
|
|
|
#7 |
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 305 ![]() |
Bonjour,
Pour la fonction table: Je pense qu'il y a une petite faute ligne 2 mnitu, create or replace type Ca peut peut-etre servir a qulqu'un d'autre un autre jour. Donc oui, pour la function table(...)ben pas mieux. Tous les DB times ont ont augmente de moitie voir doubles. Par contre, le temps CPU est plus ou moins le meme, 10% de difference maximum. Dans certains des cas de tests menes, on a un peu plus d'enqueue avec la fonction table par rapport a la temporary table, mais rien de folochon. Par contre, j'ai des physical read/writes avec la fonction table, chose que je n'avais pas du tout avec la table temporaire. C'est pour ca que la solution table est plus lente. Je sais pas trop trop pourquoi ils osnt la, mais ils sont presents a chaque fois. ![]() Dans la majorite de mes cas de tests, la memoire PGA est plus faible (10 a 30%) avec la fonction table.Et il y a bien evidemment moins de table scans avec la fonction table. Ce sera donc temporary table. skuatamad, je regarderai ton lien plus en profondeur quand j'aurai du temps. Merci |
|
|
01
|
|
|
#8 | ||||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
J'aime toujours quand les gens présent leur conclusions en oubliant de fournir leur test. Comme ça ils ont toujours raison ...
Mais je ne suis pas de tout d'accord avec vous. Et voilà pour quoi Code :
Code :
|
||||
|
|
10
|
|
|
#9 | ||||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 305 ![]() |
Je pense que j'ai l'air malin si je dis j'arrive pas a reproduire les resultats, non?
Ceci etant dit, j'ai recommence. Et les resultats (les nouveaux) ne correspondent pas trop du tout aux anciens. Ce qui m'ennuie profondement, parce que j'ai du sacrement m'embrouiller quelque part du coup, et que je dois verifier deux,trois autres trucs. Donc oui ben non, la fonction table(...) fonctionne mieux en faits. Code :
Code :
howmanyreads 1000000 table_size 5000000 |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com