Login mot de passe
Proposition modification SQLPrepare [forum - SQLManagerX]

Parcourir ce sujet :   1 Utilisateur(s) anonymes





Proposition modification SQLPrepare
apprenti-animateur
Inscrit:
2011/2/23 18:59
Messages: 87
Hors Ligne
Bonjour,

Firetox m'a adapté récemment SQLPrepare pour permettre de faire un update (plutôt qu'un insert par défaut), en passant p_replace à vrai dasn les paramètres et de passer en paramètre la liste des colonne de la table à modifier.

Cependant, cela ne fonctionne que si la table a une clé unique.

J’étais coincé avec une de mes table dont la seul clé unique est une clé combiné de deux rubriques, non clés.

Sur cette table j'avais besoin de faire des UDPATE sur toutes les lignes, mais avec des valeurs différentes. Il me fallait donc envoyer autant de requêtes UPDATE que de lignes. Plutôt lent.

J'ai donc légèrement modifier le code de SQLPrepare une nouvelle fois, pour passer en paramètre une requête quelconque et qu'a chaque appel successif, "SourcePrep" qui sera exécuter par le SQLExecute() final, concatène les requêtes envoyées, en les séparant par un point virgules.

Ainsi, les requêtes ne sont envoyés que lorsque la taille totale atteint 32k. Moins d'envoi c'est du temps de gagné.
Après, je ne sais pas si du coté du serveur, c'est plus rapide d'exécuter une suite de requêtes séparées par un ; que de les exécuter au fur et a mesure qu'il les reçois une par une.

Un essai rapide me donne, dans mon cas, un temps d’exécution qui passe de 18s a 3s, soit un gain de 6x.

Voici mon code. Firetox, puis je avoir ton avis ?:


FONCTION  VIRTUELLE SQLManagerX
::SQLPrepare(p_requete est une chaîne "",p_REPLACE est un booléen Faux,p_listeColonne est une chaîne "")

ret est un booléen Vrai
chaineAjout est chaîne 

//si un lock est en cour on l'annule    
:SQLDeadLock()

// Prepare une requete avant de l'envoyer
chaineAjout p_requete //modif by FB
SI p_requete "" ALORS     //modif by FB 
    
chaineAjout = :SQLInsert(Vrai,0,p_REPLACE,p_listeColonne//modif by FB
FIN  //modif by FB

SI ::transaction ALORS
    SI PAS 
:SQltransac OU :base<>"MYSQL" ALORS
        
:MySQL:MysqLtransaction((:MySQL:MySQLdebut),1)
        :
SQltransac Vrai
    FIN
FIN


SI 
:base<>"MYSQL" OU Taille(:SourcePrep)+Taille(chaineAjout) >= 32767 ALORS 
    SI 
:SourcePrep "" ALORS :SourcePrep += chaineAjout
    ret 
= :SQLExecute(PAS ::transaction)
    :
SourcePrep ""
FIN
SI 
:base "MYSQL" ALORS 
    SI p_requete 
"" ALORS //modif by FB
        
SI :SourcePrep "" ALORS :SourcePrep += chaineAjout SINON :SourcePrep +=","ExtraitChaîne(chaineAjout,2,"VALUES")
    
SINON  //modif by FB
        
SI :SourcePrep "" ALORS :SourcePrep += chaineAjout SINON :SourcePrep +=";"chaineAjout
    FIN  
//fin modif by FB
FIN

Posté le : 2011/10/7 14:06
_________________
Franck Bugnet
SITOLOG
Transférer la contribution vers d'autres applications Transférer

Sujet Auteurs Dernières réponses
     Proposition modification SQLPrepare Bugnet 2011/10/7 14:06
       Re: Proposition modification SQLPrepare Firetox 2011/10/9 0:04





[Recherche avancée]