Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2012, 11h27   #1
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
Par défaut Requête SQL : équivalent de Limit?

Bonjour,
J'accède à ma table via un programme en java, et je fais ma requête sur la table en sql.
Mon problème est que la table a près de 10M de lignes (..), donc que je ne peux pas la charger en une fois, ni faire une requête type select qui me retournerait toute la table. J'avais donc penser lire la table 100lignes par 100lignes, mais le mot clé LIMIT n'est pas accepté par l'AS400.
Je fais donc un
Code :
SELECT * FETCH FIRST N ROW ONLY
pour le moment, mais (logiquement), plus j'avance dans la table, plus c'est long.
Existe t'il un moyen de faire autrement? Je ne peux pas me permettre de temporiser 10sec pour extraire des infos de la table.
Merci d'avance,
Bdloul
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 11h43   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 668
Points : 2 676
Points : 2 676
Bonjour,

la question qu'il faut se poser serai plutôt : quel est l'intérêt de ramenet 10M de lignes dans votre applicatif ??

N'êtes vous pas en train d'essayer de faire un traitement batch ...? En java qui plus est !


Bref, pour répondre à votre question initiale, lisez cet article (qui doit marcher en V5r4+) : http://g-ernaelsten.developpez.com/tutoriels/dblimit/
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 12h47   #3
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
C'est juste une question d'affichage. Je dois afficher le contenu de la table sur une page web, en utilisant les technos J2EE. Je me suis dit que j'allais faire une connexion sur l'as400 ou sont les tables dans mon code modèle et que j'allais afficher le contenu de la table 100lignes par 100lignes. Fin bref ça me semble le plus simple & le truc que tu m'as filé va me permettre de limiter le nombre de ressources utilisées.
Bref merci.
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 13h23   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 668
Points : 2 676
Points : 2 676
Sinon regardez du côté de votre driver jdbc, il doit supporter ce genre de chose.
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 17h00   #5
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
Je récapitule, puisque je n'ai pas été très explicite la première fois.
Je fais une interface web entre l'user et une table sur un AS400. La table contient plusieurs M de lignes, mais je voudrais les prendre seulement 100 par 100 (vu que je les affiche que 100 par 100 => bouton next).
J'ai essayé ce que vous m'avez donné en lien, mais je n'arrive pas à le mettre en place( Error : nombre de colonne incohérente).
Mais j'ai néanmoins peur que ça me simplifie juste la vie, sans accélérer la requête.
Mon maitre de stage m'a dit d'essayer un autre driver -> je ne comprends pas, et il revient dans qq jours.
Serait il possible d'avoir une brève explication?
Merci d'avance.
Bdloul
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 17h03   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 668
Points : 2 676
Points : 2 676
Quelle est la requete que vous avez essayé ?

Certain driver jdbc supporte les offset .. après le code derrière est souvant merdique.
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 09h20   #7
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
La requête :
Code :
1
2
 
WITH TABLETMP (ITNO, ITTY, ITDS, STAT) AS (SELECT ROW_NUMBER() OVER(ORDER BY MIT.MMITNO) AS NUM,MIT.MMITNO,MIT.MMITTY,MIT.MMITDS,MIT.MMSTAT FROM MITMAS AS MIT) SELECT * FROM TABLETMP WHERE NUM BETWEEN 1 AND 100
En fait je pense que je vais faire des fetch first en espérant de pas tomber sur un utilisateur qui appuie 1000 fois de suite sur le bouton next, mais ça me soule un peu de devoir faire un truc aussi sale.
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 09h24   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 668
Points : 2 676
Points : 2 676
Euh... votre erreur est normale vous déclarez une table temporaire (with) qui possède 4 colonnes, et dans le sous-select vous en avez 5.
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 09h58   #9
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
Merci de ton aide, ça marche, mais comme je le craignais ça ne résout absolument pas le problème de lenteur (~5sec pour charger la page).
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 10h05   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 668
Points : 2 676
Points : 2 676
votre colonne mmitno est indexée ?

Si oui, est-ce que le plan d'acces l'utilise ? (fonction explain de iseries navigator)
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 16h11   #11
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
J'ai "résolu" le problème.
"Fetch first XXX rows" pour n'avoir que les XXX premiers résultats (j'incrémente à chaque <NEXT=>) & "FOR READ ONLY", qui accélère considérablement le temps de lecture de la table.
J'ai mis aussi "OPTMIZE FOR XXX ROWS", mais je doute de sa pertinence ici.
Merci de votre aide en tout cas.
Bdloul
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h48.


 
 
 
 
Partenaires

Hébergement Web