Vous n'êtes pas identifié(e).

#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 smile

#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                   1

lors 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'ordre

enfin dans la base j'ai uniquement changé la colonne ordreDeTri

libelle | reference | ordreDeTri
CCC        5                   1
AAA         6                   0

si 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                   2

car 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                   1

je 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? smile

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 smile
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

Pied de page des forums

Propulsé par FluxBB