Optimisation du traitement avec base de donnees

hlimaiem Messages postés 106 Date d'inscription dimanche 19 mars 2006 Statut Membre Dernière intervention 17 janvier 2007 - 21 avril 2006 à 04:24
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 - 22 avril 2006 à 12:47
Limaiem heykel
Voila, j'ai un traitement sur une base de donnees qui peut contenir j'usqu'a 20000enregistrement ou meme plus, et mon traitement consite a recuperer chaque element de la base de donnees et de le comparer a tous le reste pour compter le nombre d'apparition d'un attribut "phone1" dans tous le reste de la bases. Le traitement et trop lent surtou apres que j'ai collecter bq de donnees sur ma base de donnees. J'ai meme penser a utiliser les vue pour alleger le traitement mais y'a pas eu de grande difference. Voici mon code et je voudrait savoir s'il y a possiblite d'acceler le traitement des infos.
remarque :J'utilise une base de donnees sur mysql.
...
view1.executeUpdate("CREATE VIEW v1 AS SELECT * FROM phonenumber WHERE phone1<>0");
view2.executeUpdate("CREATE VIEW V2 AS SELECT * FROM phonenumber WHERE phone2<>0 AND phone1=0");

....

ResultSet rv1 = dv1.executeQuery("SELECT DISTINCT phone1 FROM v1");
while(rv1.next()){
String tel1 = rv1.getString("phone1");
ResultSet rv11 = dv11.executeQuery("SELECT * FROM v1 WHERE phone1='"+tel1+"'");
String tip1="";
while(rv11.next()){
tip1= rv11.getString("type");
}
ResultSet rdis1 = dis1.executeQuery("SELECT COUNT(phone1) AS num FROM v1 WHERE phone1='"+tel1+"'"); int num 0; rdis1.next(); num rdis1.getInt("num");

ResultSet rechnum = rnum.executeQuery("SELECT rep FROM number WHERE numero='"+tel1+"'");
int trnum=0;
while(rechnum.next()){ trnum=rechnum.getInt("rep");}
if (trnum==0){
upv1.executeUpdate("INSERT INTO number (numero,rep,type) VALUES ('" +
tel1 + "','" + num + "','" + tip1 + "')");
}else{
num +=trnum;
insv1.executeUpdate("UPDATE `number` SET `rep`='" + num + "' WHERE `numero`='" + tel1 + "'");

}

System.out.println(tel1+" "+num);
}
drop1.executeUpdate("DROP VIEW v1");
drop2.executeUpdate("DROP VIEW v2");

}

3 réponses

cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
21 avril 2006 à 09:01
SAlut,
premièrement il ne sert à rien de créé une vue juste pour faire ta requête et ensuite de la détruire. De même si ta requête prend trop de temps pourquoi ne pas indexexer ta colonne phone1. Ensuite n'extrait que ce sue tu as besoin (ex de 'type' car cela passe sur la bande passante ... ;-) même si la base est sur la même serveur ...

Fais ton COUNT en même temps que ta requête précédente ça évitera un aller/retour serveur et de devoir relancer toute une requête surtout que ta condition est la même.


Sinon le mieux encore est de créer des procédures stockées qui feront ton traitement ;-)

Voilà j'espère qu'en combinant ces quelques points tu arriveras à quelque chose ;-)

PS: j'espère que la variable tel1 n'est pas exposé à des utilisateurs externes à ton entreprise sinon l'injection SQL est un jeu d'enfant ;-) Si exposé, alors sécurise le tout au minimum avec des PreparedStatement (requête paramétrée) : que tu accèdes via Connection.prepareStatement tout comme une requête classique ...

++
0
hlimaiem Messages postés 106 Date d'inscription dimanche 19 mars 2006 Statut Membre Dernière intervention 17 janvier 2007
21 avril 2006 à 13:10
Limaiem heykel
Merci beaucoup pour votre aide mais :
C'est koi les procedure strockees qui font mon traitemenent (je travaille sur mysql) , y'a t -il un exemple de creation de procedure stockee?
pour les prepareStatement y'a t-il un exemple pour que je chasse le manipuler puisque je n'en ai acune idee.
Merci enormement
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
22 avril 2006 à 12:47
Pour les procédures stockées il ta faut MySQL 5 (le 4 n'a aps cette fonctionnalité), tu trouveras des exemples de proc stockées sur mysql.com

Requeêts paramétrées tu as juste à faire une petite recherche sur google ;-) Ca retoure beaucoup de choses inétressante s;-)

++
0
Rejoignez-nous