Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Base de donnée temporaire dans Perl ?

6 réponses
Avatar
Chloe Sival
Bonjour,

J'ai une petite question:

J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id=105 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id=105 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id=105 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id=105 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";


Mon soucis est qu'il exécute 5000 fois le même update.

Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":

trois critères:
Dom_id
Date_Start
Date_End

et des données:
mails_total
mails_rbl
MO_received
MO_blocked



qui me sortirait a la fin un

Dom_id=105
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total=35
mails_rbl=35
MO_received=22.75
MO_blocked=22.75

Dom_id=105
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total=82
mails_rbl=82
MO_received=53.30
MO_blocked=53.30


j'aurais réussi a "regrouper" (dans mon exemple) 117 requêtes update en
deux requêtes ;=)

merci d'avance pour vos suggestions
Chloe

6 réponses

Avatar
Paul Gaborit
À (at) Wed, 15 Apr 2015 07:14:41 +0200,
Chloe Sival écrivait (wrote):

J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:


[...]

Mon soucis est qu'il exécute 5000 fois le même update.


[...]
Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":


[...]

j'aurais réussi a "regrouper" (dans mon exemple) 117 requêtes update
en deux requêtes ;=)

merci d'avance pour vos suggestions



Désoalé. Mais sans description ni du but général, ni des des tables
utilisées (ici, je n'en vois qu'une) et en ne donnant comme seul exemple
qu'un seul ordre SQL répété (pourquoi le répéter 5000 fois ?), je ne
vois pas quelle suggestion faire... Si ce n'est d'exposer clairement le
souci ! ;-)

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Benoit Izac
Bonjour,

le 15/04/2015 à 07:14, Chloe Sival a écrit dans le message
<552df3c0$0$3162$ :

J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";


Mon soucis est qu'il exécute 5000 fois le même update.

Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":

trois critères:
Dom_id
Date_Start
Date_End

et des données:
mails_total
mails_rbl
MO_received
MO_blocked

qui me sortirait a la fin un

Dom_id5
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total5
mails_rbl5
MO_received".75
MO_blocked".75

Dom_id5
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total‚
mails_rbl‚
MO_receivedS.30
MO_blockedS.30



Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
my $k = "$dom,$start,$end";
$tmp_db{$k}{mails_total} = 35;
# ...

for my $k (keys %tmp_db) {
my ($dom, $start, $end) = split /,/, $k;
my $mails_total = $tmp_db{$k}{mails_total};
# ...
# envoi de la requête pour cette clé
}

Bien évidemment, il faut trouver un séparateur qui n'apparait dans aucun
des trois champs.

--
Benoit Izac
Avatar
espie
In article , Benoit Izac wrote:
Bonjour,

le 15/04/2015 à 07:14, Chloe Sival a écrit dans le message
<552df3c0$0$3162$ :

J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";


Mon soucis est qu'il exécute 5000 fois le même update.

Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":

trois critères:
Dom_id
Date_Start
Date_End

et des données:
mails_total
mails_rbl
MO_received
MO_blocked

qui me sortirait a la fin un

Dom_id5
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total5
mails_rbl5
MO_received".75
MO_blocked".75

Dom_id5
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total‚
mails_rbl‚
MO_receivedS.30
MO_blockedS.30



Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
my $k = "$dom,$start,$end";
$tmp_db{$k}{mails_total} = 35;
# ...

for my $k (keys %tmp_db) {
my ($dom, $start, $end) = split /,/, $k;
my $mails_total = $tmp_db{$k}{mails_total};
# ...
# envoi de la requête pour cette clé
}

Bien évidemment, il faut trouver un séparateur qui n'apparait dans aucun
des trois champs.



Pourquoi faire ? on est en 2015, tous les perl existants font de
l'autovivification, et avoir un hash a 3 niveaux est raisonnablement simple.
Avatar
Paul Gaborit
À (at) Wed, 15 Apr 2015 09:50:15 +0200,
Benoit Izac écrivait (wrote):
[...]
Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :


[... snip le code ...]

Votre boule de cristal semble en meilleur état que la mienne pour
réussir à comprendre la demande initiale. Il faut que je l'amène en
révision.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Benoit Izac
Bonjour,

le 15/04/2015 à 15:03, Marc Espie a écrit dans le message
<mglnju$11gc$ :

Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
my $k = "$dom,$start,$end";
$tmp_db{$k}{mails_total} = 35;
# ...

for my $k (keys %tmp_db) {
my ($dom, $start, $end) = split /,/, $k;
my $mails_total = $tmp_db{$k}{mails_total};
# ...
# envoi de la requête pour cette clé
}

Bien évidemment, il faut trouver un séparateur qui n'apparait dans aucun
des trois champs.



Pourquoi faire ? on est en 2015, tous les perl existants font de
l'autovivification, et avoir un hash a 3 niveaux est raisonnablement
simple.



Donc tu proposes :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
$tmp_db{$dom}{$start}{$end}{mails_total} = 35;
# ...

for my $dom (keys %tmp_db) {
for my $start (keys %{$tmp_db{$dom}}) {
for my $end (keys %{$tmp_db{$dom}{$start}}) {
my $mails_total = $tmp_db{$dom}{$start}{$end}{mails_total};
# ...
}
}
}

C'est bien cela ?

--
Benoit Izac
Avatar
Benoit Izac
Bonjour,

le 15/04/2015 à 16:50, Paul Gaborit a écrit dans le message
:

Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :


[... snip le code ...]

Votre boule de cristal semble en meilleur état que la mienne pour
réussir à comprendre la demande initiale. Il faut que je l'amène en
révision.



La seule chos que j'ai compris, c'est qu'elle veut éviter d'envoyer la
même requête SQL un grand nombre de fois et qu'elle souhaiterai donc
stocker dans une base de donnée "temporaire" (je le comprends comme "en
mémoire") avant d'envoyer les requêtes nécessaires à la mise à jour de
la base SQL.

Je ne comprends pas non plus le pourquoi du comment de ces 5000 répétitions
et je trouve ça également surprenant si ça peut rassurer sur le mauvais
état de la sphère divine.

--
Benoit Izac