PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#2 Général » meilleur solution pour une autoincrementation avec un select » 03/01/2013 16:21:19

aznur
Réponses : 4

voila j'aimerai l'avis de personne expert  sur Postgresql

le probleme peu etre bete
j'ai deja une solution toute trouver mais j'aimerai votre avis car ma solution et loin d'etre tres fine

voila je fait un select  systematique sur une table lorsque un individu envoie une certaine  requete sur le site

pour savoir si la donnee existe  (si elle n'existe pas je la cree ) si elle existe j'aimerai incrementé un int
pour pouvoir par la suite faire une statistique gloable

la solution bateau et de faire un select

-un insert si le select revien vide

-et un update  de l'increment si le select n'est pas vide

je ne parle pas ici d'un increment d'une clee primaire par l'insert

mais d'un increment d'une ligne

exemple les colone son ID  champtext  et NBconsultation

c'est le champs  NBconsultation que j'aimerai autoincrementé à chaque select

seulement j'aimerai connaitre votre avis et je pense que cela doit etre possible avec une regle
et donc sans envoyer une 2eme requete  de type update

#3 Re : Optimisation » optimisation requette full text ne pas metre a jour toute la table » 20/08/2012 18:22:20

oue enfin sa depend de quel point de vue on se place

enfaite mon idee de depart ete
faire un select  de la date  de mise a jour
si besoin de mise a jour on fait un select de frequencemot
le programme java  calcule  avec l'algorithme
on fait un controle pour savoir si l'ancien contenu et valide  dans le programme java donc en claire si frequence mot a changer
on fait un update juste sur la fonction maj  ou sur les colone maj et frequence mot suivant les cas

donc du coup cela devient

on fait un select de la date
si besoin de mise a jour
le programme java  calcule  avec l'algorithme
on fait donc systematiquement un update de la colone maj et frequencemot
la le trigger intervient
si frequencemot  n'a pas changer ou si il a changer

en terme de performance  le select et bcp plus couteux que l'update ? je ne connais pas beaucoup les bdd donc ... je me renseigne  bon j'imagine que oui

bon donc mon super trigger devient

CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
IF ( (TG_OP = 'INSERT') OR ((TG_OP = 'UPDATE') AND (OLD.frequencemot <> NEW.frequencemot)) ) THEN
NEW.idxsearch = to_tsvector(coalesce(NEW.frequencemot,''));
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER montriggermajupd BEFORE INSERT OR UPDATE OF frequencemot ON information 
FOR EACH ROW EXECUTE PROCEDURE maj();

#4 Re : Optimisation » optimisation requette full text ne pas metre a jour toute la table » 20/08/2012 17:50:41

donc cela nous donne 2 triggers et une fonction trigger
le premier trigger sur insert et le seconde sur update et plus particulierement sur les update de la colone frequencemot

CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
NEW.idxsearch = to_tsvector(coalesce(NEW.frequencemot,''));
RETURN NEW;
END
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER montriggermajUpd BEFORE UPDATE OF frequencemot ON information 
FOR EACH ROW EXECUTE PROCEDURE maj();

CREATE TRIGGER montriggermajIns BEFORE INSERT  ON information 
FOR EACH ROW EXECUTE PROCEDURE maj();

j'ai tout bon ?

#5 Re : Optimisation » optimisation requette full text ne pas metre a jour toute la table » 20/08/2012 17:21:44

lol autant pour moi j'ai confondu row et column ... (boulet)

ok je te remercie pour le temps passer a m'aider
depuis la version 9.0 donc enfaite c'est pas tres vieux ok merci encore

#6 Re : Optimisation » optimisation requette full text ne pas metre a jour toute la table » 20/08/2012 17:08:17

merci pour le if sa peu etre interesant dans un autre cas 

mais je ne penser pas forcement à ce cas la enfaite

je voudrais savoir si on  ne  peu  pa jouer sur  LA conlone quand on declare lactivation de la fonction  genre

FOR EACH ROW EXECUTE PROCEDURE maj();

au lieu de EACH ROW  je ne sais pas comment sa fonctionne mais ne pourai t'on pas metre juste la colone concernee  exemple frequencemot

qui devient alor

FOR frequencemot  EXECUTE PROCEDURE maj();

car par exemple je pourai avoir une variable de maj dans ma table qui  contient la derniere date a laquel la maj a ete faite

je fait une requete select * dans mon programe par exemple et je refait le  calcule  de la source avec le meme algorythme que la premier insertion (sa parai logique)

si les valeur change alor je fai un update de tout  se qui doi l'etre  on passe alor dans le trigger d'update

si par contre rien n'a changer sauf la date de la maj  qui devient la valeur apres le dernier scan effectuer dans le programe alor je fait un update seulement sur la maj

si je peu specifier la colone sur laquele le trigger agit  je ne declenche meme pas celui ci

si je fai un update de ma variable maj

est ce possible ?

dans ce cas la j'utilise un trigger d'insert qui se declenche  à l'insert quelque soi la colone donc EACH ROW  et un autre d'update  QUI se declenche seuelement si la colone Frequencemot subit l'update

#7 Re : Optimisation » optimisation requette full text ne pas metre a jour toute la table » 20/08/2012 16:20:09

du coup mon code de creation trigger et devenu

CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
NEW.idxsearch = to_tsvector(coalesce(NEW.frequencemot,''));
RETURN NEW;
END
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER montriggermaj BEFORE INSERT OR UPDATE ON information 
FOR EACH ROW EXECUTE PROCEDURE maj();

j'ai bon ? la j'ai essayer sa à l'aire de fonctionner comme je veux du moin mon programe fai pas encore d'update maintenant ya peu etre moyen d'optimisé
par exemple la fin et

FOR EACH ROW EXECUTE PROCEDURE maj();

si j'ai bien compris pour chaque  colone il effectue la requete meme si l'update ne met pas a jour frequence mots  mai dans ce cas la je devrai faire 2 trigger
1 qui soccupe de l'insert
et un qui s'occupe de l'update de la colone frequence mots

est ce que ça vos le coup je veut dire gagnerais t'on meme quelque disieme de  seconde sur des millier/million de requete  ?
tant qu'a faire quelque chose ... autant le faire le mieux possible

#8 Re : Optimisation » optimisation requette full text ne pas metre a jour toute la table » 20/08/2012 14:13:54

donc enfaite le trigger s'intercale  entre la requete et la bdd
se qui permet l'interception des donnees par la variable new
mais sa ouvre des perspective tout à fait nouvel ça

#9 Re : Optimisation » optimisation requette full text ne pas metre a jour toute la table » 20/08/2012 13:56:28

merci pour les réponses à mes questions

j'ai à peu pres tout compris seulement la vous me parler de geree l'update ce n'est pas faux mais pourais je utiliser le meme trigger  (j'imagine que oui) parce que  je vais tomber dans une boucle infini
l'update fait appele au trigger qui fait apele à update ... qui ...... trigger update  trigger update

parce que si je fait un update  qui change des mots  par mon code dans mon programme ici  java/tomcat  il faut que je reface

UPDATE information 
SET idxshearch = to_tsvector(coalesce(frequencemot,'')) WHERE clee=NEW.clee;

pour remetre à jour mon idxshearch
puisque  que je vien de metre à jour  frequencemot par exemple
or je tombe sur un bon gros cas de boucle infinie bien velue

j'ai vue dans le lien de la doc  pour faire sa requete utilise une timekey
l'idee serai:
-je fait un update via mon logiciel pour modifier un ou plusieur  champ
-le trigger et appeler il fait un update
-il verifie le temps si le temps et superieur à la limite du temp qui et fixer on fait un update
-le trigger se redeclenche forcement
-le temps vien d'etre mi a jour
-puisque le temp et inferieur a la limite
-il ne passe pas une nouvel fois dans l'update

ce serais une solution mais est ce "la" solution la plus efficance/simple

parce que avec cette solution je  relance à nouveau le trigger pourais t'on dire pour rien et encore une fois j'ai  l'impresion d'utiliser la bombe nucleaire pour chasser les mouche
sa fonctionne mais c'est pas tres fin

#10 Re : Optimisation » Disque saturé en écriture avec PosgresQL 8.4 et 2PC » 20/08/2012 00:07:38

mais avant l'afflux de donnee puisque vous dite que cela vien d'ariver vous ne rencontriez pas des ralentisement ? qui permetrez de dire que la limitation et hardware ?

le ram disque n'est pas une heresie il faut simplement prendre quelque precaution comme utiliser un onduleur .. par exemple
pour dire de sauvegarder les donnee sans avoir de probleme


avec un ram disque meme si la perte de donne ne vous inquiete pas il yora quelque précaution à prendre pour evite les bdd corompu  pendant une maj foireuse genre coupure d'electricite en plein millieu apres je ne connais pas le materiel d'on vous disposer

qu'entendez vous par gros volume de donnee ?

#11 Re : Optimisation » quel SSD pour booster une base de données ? » 19/08/2012 23:35:25

+ 1 pour la ram
mais alors la question que tout le monde se pose peu t'on dire à postgresql de chager la totalité de le base de donnee si elle n'est pas trop grosse biensur en memoire
(< a la ram quoi)
et de faire des sauvegarde reguliere sur le disque dur avant la femerture ou doit t'on passer par un ram disque et un script ?

ce qui reviendrai a

je demare le serveur 
un script cree  un ram disque et  charge la bdd entiere dans la ram
//eventuelement des sauvegarde de la bdd sur le disque dure a interval regulier  si pas d'ondulateur mais la c'est du suicide

je veux eteindre le serveur pour remplacer un ventilo par exemple

je doit avoir un script qui sauvegarde la bdd sur le disque dur avant de seteindre

sans compte sil ya une panne electrique avec un onduleur

pour sauvegarder proprement la bdd avant le drame

#12 Optimisation » optimisation requette full text ne pas metre a jour toute la table » 19/08/2012 23:22:37

aznur
Réponses : 14

bonjour voila je debute avec les base de donnee surtout postgresql

j'ai utiliser un tutoriel   

  pour faire une recherche dite full texte (sans dico pour le moment mais ce n'est pas le probleme )

a un moment la personne du tuto tutoriel en question
execute une requete qui permet de remplire l'index d'ont il se sert pour la recherche full text

puis apre nous dit gentillement qu'il fodra cree un trigger ( efectivement sinon la table enfin du moin la colone de cette index text de se remplie pas pendant un insert )

donc j'ai cree un trigger avec une fonction trigger le probleme c'est que je pense que j'utilise une bombe atomique pour tuer une mouche avec ma fonction

enfaite ma fonction doit refaire tout les indice de la table a chaque insert j'imagine


voici la fonction et le triger 

CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
 UPDATE information  
SET idxshearch = to_tsvector(coalesce(frequencemot,'')); 
 RETURN NULL;
END
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER montriggermaj AFTER INSERT ON information 
FOR EACH ROW EXECUTE PROCEDURE maj();


le probleme et qu'enfaite je ne vois pas comment acceder à l'insert  qui et fait au temp T et ne pas metre a jour toute la table systematiquement   
jai vue une variable NEW qui devai resoudre une parti du probleme  code mais je ne sais pas comment je peu m'en servir

une autre question j'en profite  pgadmin  me dit que je n'est pas de clee primaire est ce normal pour une recherche full text ou pas merci de m'avoir lu
à oui je suis en 9.1 pour postgrsql

Pied de page des forums

Propulsé par FluxBB