Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
736 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP/SQL] ORDER BY m'a tuer ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP/SQL] ORDER BY m'a tuer ...

n°341496
onano
Posté le 24-03-2003 à 15:22:39  profilanswer
 

salut :)
 
j'ai un souci plutot incomprehensible a vous soumettre :
 
j'ai une requete qui interroge une table qui fait un peu moins de 80000 enregistrements.
 
traitement normal de l'operation :  
 

Code :
  1. $sql = "SELECT chp1, chp2 ... FROM MaTable WHERE NUM='123456'";
  2. $res = odbc_exec($con, $sql);
  3. $row = 1;
  4. while (odbc_fetch_row($res, $row))
  5. {
  6. $var1 = odbc_result($res,"chp1" );
  7. ...
  8. $row += 1;
  9. }


 
TEMPS de l'operation : 0.07 secondes
 
maintenant, si j'ajoute un ORDER BY chp2 DESC, mon temps d'execution monte a plus de 10 secondes !!!
 
expliquez moi ce qui ne va pas svp, je craque severe ... [:flclsd]


---------------
taciturnik maladik systemik
mood
Publicité
Posté le 24-03-2003 à 15:22:39  profilanswer
 

n°341500
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-03-2003 à 15:24:25  profilanswer
 

quel SGBD utilises tu pour être obligé de passer par ODBC ?


---------------
J'ai un string dans l'array (Paris Hilton)
n°341503
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-03-2003 à 15:25:29  profilanswer
 

et puis bon, trier une table de 80000 enregistrements, ça se fait pas forcément de façon instantanée non plus ;)


---------------
J'ai un string dans l'array (Paris Hilton)
n°341511
onano
Posté le 24-03-2003 à 15:30:55  profilanswer
 

j'utilise MSSQL server 2000 sur un Win2000 server
la table fait 80000 enregistrements mais le resultat de la requete n'en comporte que 28 lui ... :(  
 


---------------
taciturnik maladik systemik
n°341514
MagicBuzz
Posté le 24-03-2003 à 15:31:33  profilanswer
 

Ben faut faire des indexes un peu :)

n°341535
onano
Posté le 24-03-2003 à 15:46:36  profilanswer
 

y'en a justement ...
 
mais les index ne devraient jouer que sur le odbc_exec, pas sur le temps d'execution du odbc_fetch_row non ??
 
perso, je comprends vraiment pas prq un ordre de tri peut mettre aussi longtemps ... je fais le meme type de requete sur des tables 2 a 3 fois + grosses et ca marche parfaitement ... :??:


---------------
taciturnik maladik systemik
n°341539
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-03-2003 à 15:50:21  profilanswer
 

onano a écrit :

j'utilise MSSQL server 2000 sur un Win2000 server
la table fait 80000 enregistrements mais le resultat de la requete n'en comporte que 28 lui ... :(  
 
 


et le champ en question a un index ?
 
edit: [:grilled]


Message édité par Harkonnen le 24-03-2003 à 15:51:11

---------------
J'ai un string dans l'array (Paris Hilton)
n°341548
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-03-2003 à 15:53:48  profilanswer
 

je connais peu SQL Server, mais peut etre est il possible que le ORDER BY soit fait sur la table entière, et non sur l'échantillon ?
un très ancien SGBD utilisait ce procédé il me semble (BTrieve pour ne pas le nommer)


---------------
J'ai un string dans l'array (Paris Hilton)
n°341550
onano
Posté le 24-03-2003 à 15:55:34  profilanswer
 

je ne peux pas te repondre sur ce point :(
 
mais comme je l'ai dit, je fais ce type de requete sur d'autres tables + lourdes et ca passe nickel ...
 
je ne pensais pas avoir de pb sur ce genre de trucs aussi "basiques" ... :cry:


---------------
taciturnik maladik systemik
n°341608
MagicBuzz
Posté le 24-03-2003 à 16:41:13  profilanswer
 

Non non, SQL Server fait le order by sur le résultat.
 
Par contre, vérifie les paramètres ODBC (y'a une chiée de paramètres que tu peux initialiser depuis le code normalement) et vérifié que le order by et le filtre ne sont pas fait côté client. Ca m'étonne, mais bon. (avec ODBC, on peut bosser de façon transactionnelle sur une copie de la table en local, et pour transfèrer 80000 lignes vers le PHP, ça pourrait bien mettre ces 10 secondes...)

mood
Publicité
Posté le 24-03-2003 à 16:41:13  profilanswer
 

n°341648
onano
Posté le 24-03-2003 à 17:12:49  profilanswer
 

tu peux me donner une piste pour ODBC ? je ne l'utilise que pour declarer mes bases alors je ne sais pas ce qui est parametrable et ce qui ne l'est pas ...
 
mais ce qu'il y a c'est que je fais ce même "traitement" sur d'autres tables, parfois + lourdes encore et ca passe toujours comme il faut ...
 
merci deja de vous etre interesse a mon cas :jap:


---------------
taciturnik maladik systemik
n°341705
MagicBuzz
Posté le 24-03-2003 à 18:09:31  profilanswer
 

Ben je peux pas du tout t'aider à ce niveau en PHP. Je ne fais que de l'ASP.
 
Mais grossomodo, avec l'ASP, quand tu as un recordset (lorsque tu utilises les bibliothèques MSADO, qui contiennent entre autre le support ODBC) il y a des propriétés telles que CursorLocation, CursorType, LockType qui permettent d'indiquer si le curseur est côté serveur ou côté client, s'il est en mode connecté ou déconnecté, et s'il verouille les lignes de la base ou non. Ca permet entre autre de créer des lignes ou de les mettre en jour directement dans l'objet, sans avoir à effectuer la moindre requête.
Il y a aussi des propriétés à l'objet Command, qui contient la requête, tels que Filter ou Sort, qui permettent d'effectuer des filtres et des tris. Lorsqu'on bosse en mode client, avec une connection active par exemple, le order by et les conditions sont recopiés dans ces objets "filter" et "sort", afin de pouvoir les modifier dynamiquement côté client. Et ceci a évidement un coût, car il faut effectuer une copie complète de la table en mémoire.

n°341831
nraynaud
lol
Posté le 24-03-2003 à 19:39:21  profilanswer
 


 
Nan, là rien à voir le client sait rien faire.
Mais j'ai pas d'explication, ordonner 28 lignes, même sur 486 c'est quasi instantanné.
Fous-toi (heu onano, MagicBuzz il s'en fout, c'est pas son pb) dans une console SQL et regarde un DESC de ta requête pour voir comment il réduit ça, il doit y avoir un truc pas catho (une connerie sur le type d'index par ex.).

n°342276
onano
Posté le 25-03-2003 à 10:13:46  profilanswer
 

:hello:
 
merci de votre aide :jap:
 
nraynaud : dans l'analyseur de requete, tout se passe bien, tout comme mon odbc_exec sous PHP (si je ne me trompe pas, cela correspond a la meme chose non ?)
 
c'est lors de mon odbc_fetch_row que ca rame et ca, je vois pas comment le faire dans l'analyseur ...


---------------
taciturnik maladik systemik
n°342570
onano
Posté le 25-03-2003 à 14:45:47  profilanswer
 

je viens de tester apres avoir supprime mes index : je divise par 5 le temps d'execution ! :pfff:  
 
vous comprenez quelque chose vous ?


---------------
taciturnik maladik systemik

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP/SQL] ORDER BY m'a tuer ...

 

Sujets relatifs
SQL : 4requetes simple ou 1 de bourrin ?Entrée clavier avec PHP en ligne de commande ?
Je cherche un assistant graphique qui génère du PHP .[PHP] Le PHP pour s'amuser avec la conjecture de Syracuse
[PHP / mySQL] Problème de création d'une table[PHP]comment mettre une image en arrière plan?
[PHP] Cryptage de sources PHP[SQL] erreur dans ma requère
[PHP] multiplier des morceaux de chaîne de caractères[SQL] table pivot ?
Plus de sujets relatifs à : [PHP/SQL] ORDER BY m'a tuer ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR