Bonjour à tous,
étant donné que found_rows ne fonctionne plus sous 10g, existe-t-il un équivalent ?
Merci d'avance
Version imprimable
Bonjour à tous,
étant donné que found_rows ne fonctionne plus sous 10g, existe-t-il un équivalent ?
Merci d'avance
Je ne pense pas que je comprend, peux tu donner quelques détails.
En fait j'avais besoin de connaitre le nombre de résultat d'une requête.
J'ai utilisé une fonction analytique qui a des perfs corrects.
S'il existe qq chose de mieux je suis preneur :)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 SELECT * FROM ( SELECT DISTINCT TA.icone_type_agence, TA.Nom_type_agence, AG.id_presto, AG.id_agence, AG.raison_social_agence, AG.code_postal_agence, AG.ville_agence, AG.password_agence, AG.telephone_agence, SL.icone_statut_logiciel, SL.nom_statut_logiciel, LG.nom_logiciel, ROW_NUMBER() OVER (ORDER BY AG.id_presto) num, count(*) OVER() count_annonce FROM TYPE_AGENCE TA, AGENCE AG, AGENCE_REMONTEE AR, STATUT_LOGICIEL SL, LOGICIEL LG WHERE TA.id_type_agence = AG.id_type_agence AND AG.id_presto = AR.id_presto(+) AND AG.id_logiciel = LG.id_logiciel AND LG.id_statut_logiciel = SL.id_statut_logiciel AND AG.id_statut_agence > -1 ) WHERE num BETWEEN 1 AND 10
Hm, essayez avec une table plus grande et dit moi si les perfs restent toujours correcte.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Connecté à : Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production JServer Release 9.2.0.5.0 - Production SQL> set timing on SQL> Select count(*) 2 From big_table; COUNT(*) ---------- 1052736 Ecoulé : 00 :00 :09.99 SQL> l 1 Select * From( 2 Select t.*, count(*) over() 3 from big_table t 4 ) 5* Where rownum < 10 ... 9 ligne(s) sélectionnée(s). Ecoulé : 00 :01 :10.11
C'est juste une idée, mais peut-être quelque chose de la forme suivante :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 select (select count(*) FROM TYPE_AGENCE TA, AGENCE AG, AGENCE_REMONTEE AR, STATUT_LOGICIEL SL, LOGICIEL LG WHERE TA.id_type_agence = AG.id_type_agence AND AG.id_presto = AR.id_presto(+) -- C'est mal ! AND AG.id_logiciel = LG.id_logiciel AND LG.id_statut_logiciel = SL.id_statut_logiciel AND AG.id_statut_agence > -1) found_row, ... -- le reste du select AND rownum < 10
En gros je rapatrie de la m à la nième. lignes et j'ai besoin de connaitre le nombre total si je n'avais pas eu la limite pour créer la pagination
Je ne pense pas car la requête simulant le found_rows n'est pas liée avec le reste de la requête, et le résultat devrait être mis en cache une seule fois.
Essayez-là et dites-moi ;)
j'ai testé, j'ai exactement le même coût en utilisant la fonction analytique.
Edit : j'ai l'impression qu'il ne tient pas compte de cela dans son plan d'execution
En faisant la requête sur une table simple (2 millions de lignes, pas d'index), j'ai un temps de réponse de 1.75 sec pour ma requête contre 6.2 sec pour celle utilisant la fonction analytique.
Maintenant en prenant en compte les jointures, celà peut effectivement modifier les résultats.
Oui, je pense que je vais garder cette méthode :)
Je suis curieux et perfectionniste, si quelqu'un trouve une façon plus rapide, je suis preneur :)
Merci pour votre aide à tous.
Salut,
Je ne comprends pas très bien ta phrase, mais pour ta culture personnelle je te refourni le lien vers asktom donné par mnitu dans une précédente discussion sur la pagination.
Bon c'est toufu, il y a environ 6 ans de posts, mais si tu cherches "google" dans la page tu verras ce que préconise Tom Kyte sur ce thème.
Pour résumer, un accès direct "dernière page" est inutile car :
1) les utilisateurs vont raremant plus loin que la 2eme ou 3eme page (et encore je suis large :)).
2) le temps de réponse augmente page après page, donc pour les dernières ...
3) google est la référence et google ne le fais pas (j'aime beaucoup cet argument :))
Evidemment ce sont des préconisations pour un moteur de recherche, je ne connais pas la finalité de ta requête mais ça peut quand même t'intéresser.