Limiter le nombre de lignes comptées par COUNT(*) [maj : ça marche !]

Limiter le nombre de lignes comptées par COUNT(*) [maj : ça marche !] - SQL/NoSQL - Programmation

Marsh Posté le 22-03-2004 à 17:52:07    

Salut, :hello:
J'utilise mysql 4 et il y a truc qui me dérange dans mon code actuel. Pour savoir combien de résultats j'aurais avec une commande j'utilise bien sûr count(*). Mais voilà, au delà d'un certain chiffre, ça ne m'intéresse plus de savoir si j'aurais 100 ou 10 000 résultats : je veux juste savoir si j'en aurais plus de 100.
Je me demande s?il n'y a pas moyen de spécifier qu'il n'est pas utile de compter au-delà de 100. Parceque sur des requêtes élaborées avec beaucoup de résultats, je commence à voir ma base ralentir. :sweat:
 
Y a-t-il un moyen ?


Message édité par kalex le 22-03-2004 à 22:55:38
Reply

Marsh Posté le 22-03-2004 à 17:52:07   

Reply

Marsh Posté le 22-03-2004 à 22:00:51    

J'ai trouvé un moyen bien crade :

Code :
  1. SET @nb = 0;
  2. SELECT COUNT(@nb := @nb + 1) FROM T_TABLE WHERE @nb < 100;


Voili, voilou, j'aimerais bien trouver mieux. ;)


Message édité par kalex le 22-03-2004 à 22:01:44
Reply

Marsh Posté le 22-03-2004 à 22:03:01    

C'est vraiment plus performant :??:
 
(en tout cas, elle me plait beaucoup cette syntaxe :sol: )


Message édité par mrbebert le 22-03-2004 à 22:03:48
Reply

Marsh Posté le 22-03-2004 à 22:03:31    

limit (5, 10)
 
les 10 suivants à partir du 5ème si ça peut t'aider


Message édité par jagstang le 22-03-2004 à 22:04:30
Reply

Marsh Posté le 22-03-2004 à 22:06:39    

mrbebert a écrit :

C'est vraiment plus performant :??:

D'après ce que je vois c'est vraiment minime...
Mais je ne l'ai pas encore testé sur mes grosses requêtes. ;)

Reply

Marsh Posté le 22-03-2004 à 22:09:34    

JagStang a écrit :

limit (5, 10)
 
les 10 suivants à partir du 5ème si ça peut t'aider

Merci, mais ceci limite les lignes retournées, et non pas les lignes comptées (par COUNT).

Reply

Marsh Posté le 22-03-2004 à 22:10:31    

oui logique. sorry

Reply

Marsh Posté le 22-03-2004 à 22:50:23    

wow !
Avec une requête bien tordue où COUNT(*) me donne 13 000 résultats, si je limite le nombre de résultats à 1 000, le temps d'exécution est divisé par 5 ! :ouch:

Reply

Marsh Posté le 22-03-2004 à 22:56:53    

kalex a écrit :

wow !
Avec une requête bien tordue où COUNT(*) me donne 13 000 résultats, si je limite le nombre de résultats à 1 000, le temps d'exécution est divisé par 5 ! :ouch:


 
et ca donne ? un gain effectif de ?

Reply

Marsh Posté le 22-03-2004 à 23:02:54    

HappyHarry a écrit :


 
et ca donne ? un gain effectif de ?

1er requête : 0.06 sec.
2em requête (limitée à 1000) : 0.01 sec.
 
Je signale que je suis dans de mauvaises situations pour tester : sous Windows XP (oui, je sais...). Je teste sous Linux dès que possible.

Reply

Marsh Posté le 22-03-2004 à 23:02:54   

Reply

Marsh Posté le 23-03-2004 à 09:55:14    

kalex a écrit :

wow !
Avec une requête bien tordue où COUNT(*) me donne 13 000 résultats, si je limite le nombre de résultats à 1 000, le temps d'exécution est divisé par 5 ! :ouch:

:ouch:

Reply

Marsh Posté le 25-03-2004 à 14:43:03    

Ma méthode marche bien, mais ça m'étonne qu'il n'existe pas déjà qqchose !
 

Code :
  1. SELECT @nb := 0 AS NB, COUNT(@nb := @nb +1) AS N_RES FROM T_TABLE WHERE @nb < 100;


Sinon quelqu'un pourrait m'expliquer pourquoi, cette requête me donne une fois sur deux N_RES à 0 ? :??:

Reply

Marsh Posté le 25-03-2004 à 14:46:30    

Code :
  1. SET @nb = 0;
  2. SELECT COUNT(@nb := @nb +1) AS N_RES FROM T_TABLE WHERE @nb < 100;

Je précise que cette requête là me donne toujours N_RES à 100...

Reply

Marsh Posté le 25-03-2004 à 15:00:03    

kalex a écrit :

Ma méthode marche bien, mais ça m'étonne qu'il n'existe pas déjà qqchose !
 

Code :
  1. SELECT @nb := 0 AS NB, COUNT(@nb := @nb +1) AS N_RES FROM T_TABLE WHERE @nb < 100;


Sinon quelqu'un pourrait m'expliquer pourquoi, cette requête me donne une fois sur deux N_RES à 0 ? :??:

Chez moi, elle ne fonctionne pas 1 fois sur 2, mais seulement la première fois (comme si le "@nb := 0" n'étais jamais exécuté) [:figti]
 
edit : c'est encore plus subtil que ca :pt1cable:  
Si @nb est < 50 (pas forcément 0) avant la requête, ca donne le bon résultats. Si @nb est >= 50, la requête donne toujours 0 :sweat:


Message édité par mrbebert le 25-03-2004 à 15:04:20
Reply

Marsh Posté le 25-03-2004 à 15:02:58    

En tout cas, c'est bizarre. :/

Reply

Marsh Posté le 25-03-2004 à 15:37:48    

En mettant "... WHERE @nb <> 100", là, elle fonctionne 1 fois sur 2 (si pas de réinitialisation de @nb entre temps) [:figti]


Message édité par mrbebert le 25-03-2004 à 15:40:03
Reply

Marsh Posté le 25-03-2004 à 15:58:44    

J'ai pas ces comportements...
Pour moi, une fois ça marche pas (N_RES à 0), et une autre, ça marche (N_RES à 100). Dans le premier cas, "SELECT @nb;" me donne 0 et dans le second 100.
Par contre, il suffi que je réinitialise @nb à n'importe quel chiffre inférieur à 100 (avec "SET @nb = xx" ) pour que le résultat suivant soit bon (N_RES à 100).
J'en conclu que la condition (@nb < 100) est évaluée avant l'initialisation (@nb := 0). :o

Reply

Marsh Posté le 25-03-2004 à 16:31:10    

Pour tout faire en une seule requête (et deux lignes de résultat) :

Code :
  1. SELECT @nb := 0 AS N_RES UNION SELECT COUNT(@nb := @nb +1) FROM T_TABLE WHERE @nb < 100;


QQ1 voit autre chose ? :)

Reply

Marsh Posté le 25-03-2004 à 16:47:31    

kalex a écrit :

...
J'en conclu que la condition (@nb < 100) est évaluée avant l'initialisation (@nb := 0). :o

a mon avis, c'est le cas lorsqu'aucune ligne ne respecte le WHERE.
Par contre, s'il y en a, il ne réexécute pas le "@nb := 0" (sinon, l'incrémentation serait réinitialisée à chaque fois) [:figti]

Reply

Marsh Posté le 25-03-2004 à 17:12:18    

Je pense que c'est logique puisque la requête retourne quand même une ligne (COUNT retourne 0).
 
Donc, si @nb est supérieur à 100, il n'y a aucune ligne correspondante (puisque @nb < 100 est faux), MySQL exécute COUNT (qui retourne 0), et "@nb := 0".
Pour la requête suivante, @nb est inférieur à 100, donc ça roule...


Message édité par kalex le 25-03-2004 à 17:13:33
Reply

Marsh Posté le 16-09-2004 à 02:22:11    

Je up au cas où, depuis le temps, un nouveau aurait une solution plus "standardisée". :o

Reply

Marsh Posté le 21-09-2004 à 13:24:54    

salut
pas de solution pour toi
mais si t'es sous sql server,t'a essayé de tapper dans les tables systemes pour voir le nombre d'enregistrements retournées pour ta table. Si les statistics, sont en auto-update, ca devrait etre relativement fiable. M'enfin dans ton cas pour determiner si il y a seulement plus de 100 records, ca va pas aller bcp plus vite.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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