IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Calcul simple sous MySQL


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Calcul simple sous MySQL
    Bonjour,
    j'ai un fichier de 14 Millions de lignes (soit environ 1,5 Go) sur lequel je souhaite effectuer un calcul financier simple. Le solde d'un jour est égal au solde du jour précédent - la dépense du jour. J'ai crée une procédure stockée, elle fonctionne sans problème. Cependant elle met un peu plus de 9h pour s'exécuter. J'ai essayé plusieurs méthodes : jointure de la table sur elle-même, curseur, mise en mémoire de la table (avec difficulté, mais sans faire le calcul), mais le temps de traitement reste énorme. Comme cette table reste dans les normes pour 'access', j'ai fait la même opération et le temps de traitement est inférieur à 5 minutes.

    Quelqu'un peut-il m'aider ou m'expliquer la différence de temps? cette table est une petite table, je peut être amené à traiter des tables plus importantes. Merci d'avance. voici le code de ma procédure stockée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
     declare  var1_cc bigint default 0;
     declare  var1_dc date default 0;
     declare  var1_do date default 0;
     declare  var1_sp float(12,2) default 0;
     declare  var1_sp2 float(12,2) default 0;
     declare  var1_mo float(12,2) default 0;
     declare  var1_id bigint default 0;
     declare  old_mo float(12,2) default 0;
     declare  old_cc bigint default 0;
     declare  var_sold float(12,2) default 0;
     declare done int default 0;
     
     declare curseur1 cursor for select compte_clients, dat_compta, date_ope,SP,SP2, mnt_ope, id from test_m;
     declare continue handler for sqlstate '01329' set done = 1;
     
    -- ouverture du curseur
     open curseur1;
    -- lecture 1ère ligne du curseur
     fetch curseur1 into var1_cc, var1_dc, var1_do, var1_sp, var1_sp2, var1_mo, var1_id;
     
    -- boucle repeat jusqu'au code erreur 01329 détectant la fin du fichier
     label1: repeat
    	-- Sauvegarde des données lues pour détecter changement de compte
    	set old_cc = var1_cc;
    	-- A chaque changement de compte on initialise le solde  et on sauvegarde le montant opération
    	set var_sold = var1_sp;
    	set old_mo = var1_mo;
     
    	-- on teste si la date compta et la date ope sont différentes
    	if	var1_dc <> var1_do then
    	-- si oui, on lit la prochaine ligne jusqu'a trouvé une ligne avec date compta = date ope
    		begin
    			fetch curseur1 into var1_cc, var1_dc, var1_do, var1_sp, var1_sp2, var1_mo, var1_id;
    			iterate label1;
    		end;
    	else
    	-- on a trouvé une ligne avec date compta = date ope, alors on maj le nouveau solde pour démarrer les calculs
    		update test_m
    			set SP2 = var1_SP
    		where id = var1_id ;
    	end if;
     
    	-- tant que le numéro de compte est identique on calcule le nouveau solde
    	while var1_cc = old_cc do
    		-- on lit la ligne que l'on va maj
    		fetch curseur1 into var1_cc, var1_dc, var1_do, var1_sp, var1_sp2, var1_mo, var1_id;
    		-- on calcule le nouveau solde
    		set var_sold = var_sold - old_mo;
    		-- on maj le fichier
    		update test_m
    			set SP2 = var_sold
    		where id = var1_id ;
    		-- on sauvegarde le montant ope pour le prochain calcul
    		set old_mo = var1_mo;
    	end while;
     
    until done end repeat;
     
    close curseur1;

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Désolé pour la police de caractère, je ne sais pas ce qui c'est passé

Discussions similaires

  1. [MySQL-5.0] Calcul des statistiques sous MySQL
    Par dragonfly dans le forum Administration
    Réponses: 0
    Dernier message: 18/12/2013, 11h00
  2. Réponses: 1
    Dernier message: 17/08/2008, 13h20
  3. Trigger sous MySQL + calcul de TIME
    Par dragonfly dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 01/03/2007, 12h05
  4. Problème de création de table sous MySql
    Par ducamba dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2003, 09h59
  5. Comment afficher les accent sous mysql v4.0.13
    Par buildozer dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2003, 09h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo