requete infaisable d'une traite ???

requete infaisable d'une traite ??? - SQL/NoSQL - Programmation

Marsh Posté le 13-07-2004 à 16:38:56    

slt,  
 
voila j'ai une procedure stockee qui se divise en 4 sous partie, du style:
 
requete1
requete2
requete3
requete4
 
quand j'effectue les requete une par une a la suite ca marche nikel(environ 40 seconde au total) et quand j'effectue tout d'une traite ca ne se fini pas, enfin me suis arreter a 8 minutes, comment est-ce possible ?????  
 
existe-t-il un nombre max de caracteres ds une requete ???
 
ca m'embete car je doit creer un trigger avec ce code et dc je voudrai que ca marche d'une traite, m'enfin pr moi c vraiment incomprehensible...  
 
si vs voulez le code je le mettrai mais il est un peu long a mon avis.
 
merci d'avance.  

Reply

Marsh Posté le 13-07-2004 à 16:38:56   

Reply

Marsh Posté le 13-07-2004 à 16:42:15    

en theorie je pense pas kil y est de limite de taille (g deja vu des requetes de plusierus pages). c peut etre les settings de ta db, ou alors le pc sur lequel elle tourne... c koi comme base de donnée ke t'utilise?

Reply

Marsh Posté le 13-07-2004 à 16:46:37    

je me disais aussi que c'etait pas possible pr la longueur !!!
 
sinon la base c ms-sql, je peut effectuer d'ordinaire facilement effectuer par l'analyseur de raquete 4 requete de suite,mais bon là????
 
je precise que ds les 3 derniere requetes j'utilise un curseur different a chaque fois.

Reply

Marsh Posté le 13-07-2004 à 16:53:42    

Tu es sur quel SGBD ? Elles font quoi tes requêtes ? tu peux poster le code de ta procedure stockée ?


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 13-07-2004 à 16:58:47    

mareek a écrit :

Tu es sur quel SGBD ? Elles font quoi tes requêtes ? tu peux poster le code de ta procedure stockée ?


 
voili voilo, le code :)
 
je rappel tt de meme que partie par partie la requete s'effectue nickel en 40 s, le probleme c'est que quand je la lance d'une traite telle que vs la voyer ds le code, je ne sais pas si elle se termine mais je l'ai laisser deroulée 8 minutes ????
 
merci.
 

Code :
  1. --*************************  MAJ TABLE Tickets_en_Erreur  ******************************
  2. --Remplit la table Tickets_en_Erreur et rajoute un champs "Status" mis a 0
  3. insert into Tickets_en_Erreur select Type_Dappel, Numero_De_Ticket, Point_Sémaphore, A_Number, B_Number, Location_Code, Cause_Code, La_date, Heure_Duree, A_CA__A_TO__A_NP__A_TY__B_TO__B_NP, Incoming_Route, Outgoing_Route, OM, Fichier, Talert, TRelease, B_number_T, Circuits, 0
  4. from le_04_04_27_tickets a Join Numéros_EE b
  5. on a.B_Number = b.Numéros
  6. Join Points_Semaphores p
  7. on a.Point_Sémaphore = P.ps
  8. where(( a.cause_code <> 16 and b.surveillance = 'OUI' and a.cause_code <> 255 and a.cause_code <> 88 and  a.cause_code <> 31 and Incoming_route in ( select entrant from Les_Routes)
  9. and [câblage machine] <> 'Machine de traduction') or
  10. ( a.cause_code <> 255 and  a.cause_code <> 16 and  a.cause_code <> 31 and a.cause_code <> 88 and b.surveillance = 'OUI'  and Type_Dappel in ('II', 'IP') and Incoming_route in ( select entrant from Les_Routes)
  11. and [câblage machine] <>  'Machine de traduction'))
  12. --******************************  MAJ DU CHAMPS "FAUX" DE LA TABLE Stat_Tickets_en_Erreur **********************************
  13. create table #tmp(indice_num numeric)
  14. declare @service nvarchar(40), @nb_tmp int, @nb_fx int, @num numeric, @verif int
  15. --Etape MAJ des donnees ds la table Stat_Tickets_en_Erreur concernant les tickets en erreurs
  16. declare curs cursor
  17. for
  18.    select count(*), b_number
  19.    from le_04_04_27_tickets a Join Numéros_EE b
  20.    on a.B_Number = b.Numéros
  21.    Join Points_Semaphores p
  22.    on a.Point_Sémaphore = P.ps
  23.    where(( a.cause_code <> 16 and b.surveillance = 'OUI' and a.cause_code <> 255 and a.cause_code <> 88 and
  24.    a.cause_code <> 31 and Incoming_route in ( select entrant from Les_Routes)
  25.    and [câblage machine] <> 'Machine de traduction') or
  26.    ( a.cause_code <> 255 and  a.cause_code <> 16 and  a.cause_code <> 31 and a.cause_code <> 88 and
  27.    b.surveillance = 'OUI'  and Type_Dappel in ('II', 'IP') and Incoming_route in ( select entrant from Les_Routes)
  28.    and [câblage machine] <>  'Machine de traduction'))
  29.    group by b_number
  30.    order by b_number
  31. open curs
  32. fetch curs into @nb_fx, @num
  33. while @@fetch_status = 0
  34. begin
  35.    --met de cote les numeros sur lesquels des chgt ont ete effectues
  36.    insert into #tmp(indice_num) values(@num)
  37.    
  38.    --regarde si le numero est deja ds la table Statt_Tickets_en_Erreur
  39.    select @verif = count(*) from Stat_Tickets_en_Erreur where numero = @num
  40.    --********si le numero en cours se trouve deja ds la table
  41.    if @verif <> 0
  42.    begin   
  43.       --recupere le nb de tickets deja en erreur
  44.       select @nb_tmp = Faux from Stat_Tickets_en_Erreur where numero = @num
  45.       --ajoute les new tickets en erreur
  46.       set @nb_tmp = @nb_tmp + @nb_fx
  47.       --MAJ du nb de tickets
  48.       update Stat_Tickets_en_Erreur set faux = @nb_tmp where numero = @num
  49.    end
  50.    --*******si le numero en cours ne se trouve pas deja ds la table
  51.    else
  52.    begin
  53.       select @service = Service from Numéros_EE where Numéros = @num
  54.  
  55.       insert into Stat_Tickets_en_Erreur values (@num, @service, 0, @nb_fx, 0, 0)
  56.    end
  57. fetch curs into @nb_fx, @num
  58. end
  59. close curs
  60. deallocate curs
  61. --***********************************  MAJ DU CHAMPS "BON" DE LA TABLE Stat_Tickets_en_Erreur  ****************************
  62. --Etape MAJ des donnees ds la table Stat_Tickets_en_Erreur concernant les tickets en erreurs
  63. declare curs cursor
  64. for
  65.    select count(*), b_number
  66.    from le_04_04_27_tickets a Join Numéros_EE b
  67.    on a.B_Number = b.Numéros
  68.    Join Points_Semaphores p
  69.    on a.Point_Sémaphore = P.ps
  70.    where not (( a.cause_code <> 16 and b.surveillance = 'OUI' and a.cause_code <> 255 and a.cause_code <> 88 and
  71.    a.cause_code <> 31 and Incoming_route in ( select entrant from Les_Routes)
  72.    and [câblage machine] <> 'Machine de traduction') or
  73.    ( a.cause_code <> 255 and  a.cause_code <> 16 and  a.cause_code <> 31 and a.cause_code <> 88 and
  74.    b.surveillance = 'OUI'  and Type_Dappel in ('II', 'IP') and Incoming_route in ( select entrant from Les_Routes)
  75.    and [câblage machine] <>  'Machine de traduction'))
  76.    and b_number in(select numero from Stat_Tickets_en_Erreur)
  77.    group by b_number
  78.    order by b_number
  79. open curs
  80. fetch curs into @nb_fx, @num
  81. while @@fetch_status = 0
  82. begin
  83.    --verifie si le num est deja ds #tmp, sinon il faut le mettre
  84.    select @verif = count(*) from #tmp where indice_num = @num
  85.    
  86.    if @verif = 0
  87.    begin
  88.       --met de cote les numeros sur lesquels des chgt ont ete effectues et qui ne sont pas encore ds #tmp
  89.       insert into #tmp(indice_num) values(@num)
  90.    end
  91.       --recupere le nb de tickets deja bon
  92.       select @nb_tmp = bon from Stat_Tickets_en_Erreur where numero = @num
  93.       --ajoute les new tickets en erreur
  94.       set @nb_tmp = @nb_tmp + @nb_fx
  95.       --MAJ du nb de tickets
  96.       update Stat_Tickets_en_Erreur set bon = @nb_tmp where numero = @num
  97. fetch curs into @nb_fx, @num
  98. end
  99. close curs
  100. deallocate curs
  101. --*************************   MAJ DES CHAMPS TOTAL & TAUX  DE LA TABLE Stat_Tickets_en_Erreur   ******************************
  102. declare @faux int, @bon int
  103. select @verif = count(indice_num) from #tmp
  104. if @verif <> 0
  105. begin
  106.    declare curs cursor
  107.    for
  108.       select indice_num
  109.       from #tmp
  110.    open curs
  111.    fetch curs into @num
  112.    while @@fetch_status = 0
  113.    begin
  114.       select @faux = faux, @bon = bon from Stat_Tickets_en_Erreur where numero = @num
  115.       update Stat_Tickets_en_Erreur set total = (faux + @bon) where numero = @num
  116.       if @faux < @bon
  117.       begin
  118.          update Stat_Tickets_en_Erreur set taux = ((@faux / @bon) * 100) where numero = @num
  119.       end
  120.       else
  121.       begin
  122.          update Stat_Tickets_en_Erreur set taux = 0 where numero = @num
  123.       end
  124.    fetch curs into @num
  125.    end
  126. end
  127. close curs
  128. deallocate curs
  129. drop table #tmp

Reply

Marsh Posté le 13-07-2004 à 21:32:37    

Ouhlà ! Les 3 curseurs me semblent du pur masochisme !
 
Y'a combien de tickets traîtés à chaque fois ? Quel poourcentage sont en erreur ?
 
Parceque la table temporaire #tmp est allimentée de plus en plus au fur et à mesure de la boucle, et a chaque itéreation tu va faire un select dedans, ça me semble clairement usine à gare, et la base ne peux que s'effondrer là !

Reply

Marsh Posté le 13-07-2004 à 21:34:58    

Attends 2 minutes, je te fais une petite requête SELECT toute bête qui te permettra de récupérer grossomodo les infos dont du as besoin sans passer par la table #tmp (parceque c'est clairement là que ça merde à plein tube !)

Reply

Marsh Posté le 13-07-2004 à 21:41:19    

Exemple BASIC (à toi de faire la vraie requête correspondante)
 


select email, count(email) from utilisateur
group by email
having count(email) > 1


 
=> Cette requête recherche dans la base de données toutes les emails en doublon dans la table utilisateur.
 
Reprends donc les requêtes qui allimentent les curseurs afin de récupérer les @num doublonés, et leur nombre.
 
-> En faisant un count() - 1 et havving count()-1 > 0 et en faisant alors le sum de toutes les lignes, tu auras le nombre de lignes en erreur (pas besoin de le calculer à la volée)
-> En recherchant ensuite toutes les lignes correspondant aux @num mis en évidence par la requête que je t'indique de faire, tu retrouves toutes les lignes en erreur (pense quand même à laisser passer la première à chaque fois pour que tu te comporte comme le trigger).
-> Ensuite tu peux faire tous les autres traîtements sans difficulé : tu as les lignes en erreur que tu peux updater, et de facto, les lignes que tu n'as pas updaté ne sont pas en erreur.

Reply

Marsh Posté le 16-07-2004 à 14:59:40    

Ni merci ni merde :sweat:
 
Pourrait au moins dire si mes indications sont fructueuses ou non. Ca donne un peu l'impression de s'être fait chier une heure à comprendre le fonctionnement de la procédure pour des queues de prunes...

Reply

Marsh Posté le 16-07-2004 à 17:00:49    

Qui ne dis mot consens... en gros tu dois avoir résolu son pb, donc il est meme pas revennu... Merci pour lui :D


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 16-07-2004 à 17:00:49   

Reply

Marsh Posté le 16-07-2004 à 17:01:48    

J'espère :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed