Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#26 Re : Général » Update En meme temps qu'un select » 11/01/2012 13:26:22
j'ai peut etre trouvé ma reponse:
create TEMP TABLE tri (id bigint , nouvelordre integer) ;
INSERT INTO tri select id,row_number(*) over(order by macolonne) from matable where macondition = 1 order by macolonne;
UPDATE matable set ordredutri = (select nouvelordre from tri t where t.id = matable.id);
drop table tri
4 requetes au lieu de 300 et aucun transfert réseau.
s'il existe mieux je suis prenneur ![]()
#27 Re : Général » Update En meme temps qu'un select » 11/01/2012 11:00:12
bonjour
il s'agit d'une application ou une personne accède à son compte toute seule donc pas de souci de concurrence sur la table, chaque ligne possède un discriminant pour un compte.
Et après un tri, la taille n'est pas multiplié j'ai simplement parlé d'un update d'une colonne donc si j'ai 300 lignes j'en aurais toujours 300 après simplement les 300 aurons été mise à jour
exemple si dans la base j'ai
libelle | reference | ordreDeTri
CCC 5 0
AAA 6 1lors de l'affichage je me base sur ordreDeTri pour afficher ma liste
si je tri ma liste par libelle cela va récupérer la liste trié par libellé donc une premiere requete de type:
select * from matable order by libelle;
ensuite le code qui se trouve dans ma question plus haut avec la boucle sur chaque ligne pour mettre à jour l'ordreenfin dans la base j'ai uniquement changé la colonne ordreDeTri
libelle | reference | ordreDeTri
CCC 5 1
AAA 6 0si j'ajoute une ligne BBB, meme si ma grille reste trié par libellé, cette ligne va s'ajouter à la fin
libelle | reference | ordreDeTri
CCC 5 1
AAA 6 0
BBB 7 2car lors de l'affichage de ma grille il y a toujours le order by ordreDeTri donc
AAA
CCC
BBB
si enfin je retri par libelle cela va donner:
libelle | reference | ordreDeTri
CCC 5 2
AAA 6 0
BBB 7 1je suis d'accord que sur certain poins ca ne parrait pas logique mais il s'agit d'une demande client très demandé donc pas le choix de la gérer comme cela
apres peu importe la demande, moi ce que j'aimerais eviter c'est la boucle qui realise l'update sur ordreDeTri, je voudrais lors de l'envoi de la requete :
select * from matable order by libelle;pouvoir mettre à jour mon champs ordreDeTri à la volé car le résultat qui m'est envoyé est l'odre exact dans lequel je vais mettre à jour la colonne ordreDeTri donc pourquoi avoir besoin de récupérer le résultat pour faire un update que je pourrais surement faire directement coté postgres donc éviter du transfert réseau et surtout N update.
est ce plus clair? ![]()
merci
#28 Général » Update En meme temps qu'un select » 10/01/2012 23:26:35
- palex
- Réponses : 6
Bonjour
j'ai une demande un peu particulière afin de gérer une liste d'affichage sur une application.
je dois gérer le fait que sur la grille en question l'utilisateur puisse trier ses infos sur tel ou tel colonne et que s'il rajoute un produit dans la liste, le produit s'ajoute en fin de liste sans tenir compte du tri appliqué.
pour cela j'ai ajouté dans ma table un champs qui me sers pour connaitre l'ordre d'affichage, du coup à chaque affichage de ma grille je fais toujours un order by ordreDuTri, du coup dès que je clique sur un en tete de colonne j'execute ma requete sur le tri en question et je mets à jour ma colonne ordre de tri et enfin pour afficher le rendu final je recupere les infos en ayant toujours le order by ordreDeTri du coup les infos sont bien affiché dans le bonne ordre vu que je viens de mettre à jour ce champs dans l'ordre ASC.
Mon souci c'est le fait de jouer la premiere requete sur le tri selectionné et de mettre à jour mon champs ordreDeTri.
Exemple si j'ai 300 produits dans ma grille que je veux trier sur le libelle, je recupère donc cette liste trié sur le libellé et derriere je met à jour le champs ordreDeTri pour que l'affichage final soit ok, du coup si je rajoute un produit dans la liste, je luis met un max(ordreDeTri)+1 et vu que je tri ma liste toujours en fonction de ce champs et bien il se retrouve en fin de liste comme il le faut.
mais ce qui m'embete c'est le fait de recupérer mes 300 lignes dans un ordre et de faire derrière 300 update en ayant uniquement changé le champs ordreDeTri
du coup j'ai dans mon code:
List<Object> lst = monDao.getMyList();
int ordreDeTri = 0;
for(Object obj : lst){
obj.setOrdreDeTri(ordreDeTri++);
monDao.saveOrUpdate(obj);
}donc si lst contient 300 objets j'ai 300updates qui passe en base.
j'aimerais donc savoir s'il y a un moyen au moment d'envoyer ma requete select de faire l'update directement en fonction du resultset donc envoyer le select et mettre à jour le champs ordreDeTri directement sans avoir a faire les 300requetes pas la suite.
la demande n'est pas simple à expliquer, j'espère avoir été clair ![]()
n'hésitez pas à me dire si vous n'avez pas compris j'essaierai d'être plus clair.
merci beaucoup
#29 Re : Optimisation » Probleme effective_cache_size » 30/10/2011 14:33:10
Ok je verrais tout cela lundi. La requete a ete revu aussi et a permis de gagner un peu de temps mais j ai un gros souci c est que j aimerais bien comprendre pourquoi la meme requete prend un temps completemet different alors que mon pc est cense etre moins rapide que la prod en plus, je verifierai les schemas au cas ou mais il s agissait d un dump puis restore.
Je vous tiens au courant des que j ai pu tester tout cela.
Merci
#30 Re : Optimisation » Probleme effective_cache_size » 28/10/2011 14:07:09
existe t il un moyen de mettre en debug certaines chose afin de voir pourquoi il choisi tel ou tel algorithme ? quitte a ce que j'ajoute des write dans le code source juste pour moi?
merci
#31 Re : Optimisation » Probleme effective_cache_size » 28/10/2011 12:20:09
bonjour
je viens de lancer un serveur 8.4.7 en local pour etre iso prod et j'ai executé la requete et elle utilise bien un bitmap index scan meme avec cette version donc la prod devrait faire la meme, j'ai fait des vaccum annalyze sur les bases pour que les index soient à jour mais rien ne change. donc je comprend pas.
#32 Re : Optimisation » Probleme effective_cache_size » 27/10/2011 17:51:48
ok je vais voir dans quel mesure il est possible de passer en 8.4.9 voir meme 9 et supérieur! et je vais égalemetn télécharger une version 8.4.7 en local pour faire quelques test afin d'etre dans quasiment les memes conditions
merci pour votre aide
#33 Re : Optimisation » Probleme effective_cache_size » 27/10/2011 15:35:25
j'ai oublié de preciser je suis en 8.4.9-0ubuntu0.10.10 (32bits) et sur la qualif en 8.4.7 on x86_64-unknown (64bits)
#34 Re : Optimisation » Probleme effective_cache_size » 27/10/2011 15:09:13
bonjour!
je viens de jouer l explain analyze sur ma machine et sur une machine de qualif
voici les liens du resultat :
ma machine : http://explain.depesz.com/s/R7m
qualif : http://explain.depesz.com/s/EPD
merci de m'expliquer ce qui n'irai pas entre les 2 sachant que les bases contienne les memes index etc.. les seules chose qui changent sont les conf postgres au niveau du effective_cache_size, shared_buffer...
que préconiseriez vous comme configuration postgres sur cette machine :
ipcs -l -m
------ Limites de la mémoire partagé --------
max number of segments = 4096
max seg size (kbytes) = 67108864
max total shared memory (kbytes) = 17179869184
taille minimum de segments (octets) = 1
free
total used free shared buffers cached
Mem: 2059580 2049004 10576 0 4572 1745484
-/+ buffers/cache: 298948 1760632
Swap: 2097144 14308 2082836
merci pour votre aide.
#35 Re : Optimisation » Probleme effective_cache_size » 26/10/2011 20:04:53
Oui ok pour la valeur par defaut je me suis mal exprime mais je me douttai qu il y avai une valeur par defaut pardon.
#36 Re : Optimisation » Probleme effective_cache_size » 26/10/2011 20:03:35
Je suis sur linux mais ce que je comprends pas c est que la requete qui est longue s execute sur un serveur qui tourne depuis plusieurs heures, du coup le cache est deja rempli...il devrai alle vite...la je coupe le serveur en desactivant ce parametre donc sans le cache et ma requete s execute en moins de 500ms...ya un truc que je saisie pas mais je regarderais le plan d execution et les vaccums pour voir. Merci pour ces informations
#37 Optimisation » Probleme effective_cache_size » 26/10/2011 19:31:23
- palex
- Réponses : 16
Bonsoir a tous!
J aurais voulu avoir quelques explications sur le parametre effective_cache_size et sont fonctionnement. Car en local lorsque ce parametre est desactive j ai des temps de reponse tres correct. J ai essayer comme preconise dans le fichier de conf postgres de le positionner a 1/2 de ma Ram et au 3/4 pour le mettre au taquet comme recommande sur la doc postgresql. Mais des que je l active, une requete qui prend 300ms en temps normal dure plus de 10 minutes! Voir plus...
Pourtant ce parametre se trouve dans la section querry tunning du fichier, je pensais avoir de meilleur perf avec...serais t il couple avec d autre parametre du fichier de conf a ne pas negliger?
Merci beaucoup
#38 Re : Général » Changer l'affichage » 07/10/2011 11:19:36
effectivement,cela fonctionne.
merci beaucoup
#39 Général » Changer l'affichage » 07/10/2011 10:57:02
- palex
- Réponses : 3
bonjour
j'ai l'habitude d'utiliser postgresql et depuis quelques temps après avoir changer de machine et de version lorsque j'exécute une requête le résultat s'affiche et je dois appuyer sur Q pour qu'il disparaisse, est il possible de basculer avec l'ancien affichage facilement afin d'exécuter une requête et de pouvoir rejouer une requête de suite en ayant toujours le résultat de la requête précédente qui est toujours afficher?
je travail sur une grosse base qui contient beaucoup de FK et lorsque j'exécute une recherche si l'affichage disparait je doit retenir les N FK que je viens de voir donc si j'oublie je doit rejouer la requête du coup je perd un peu de temps.
merci beaucoup