Base de donnée temporaire dans Perl ?
Le
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_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
j'aurais réussi a "regrouper" (dans mon exemple) 117 requêtes update en
deux requêtes ;=)
merci d'avance pour vos suggestions
Chloe
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_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
j'aurais réussi a "regrouper" (dans mon exemple) 117 requêtes update en
deux requêtes ;=)
merci d'avance pour vos suggestions
Chloe
Chloe Sival
[...]
[...]
[...]
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 - Perl en français -
le 15/04/2015 à 07:14, Chloe Sival 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 :
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
Pourquoi faire ? on est en 2015, tous les perl existants font de
l'autovivification, et avoir un hash a 3 niveaux est raisonnablement simple.
Benoit Izac [...]
[... 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 - Perl en français -
le 15/04/2015 à 15:03, Marc Espie a écrit dans le message
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
le 15/04/2015 à 16:50, Paul Gaborit a écrit dans le message
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