Comment faites-vous LIMIT
dans DB2 pour iSeries?
J'ai une table avec plus de 50 000 enregistrements et je souhaite renvoyer les enregistrements de 0 à 10 000 et les enregistrements de 10 000 à 20 000.
Je sais qu'en SQL vous écrivez LIMIT 0,10000
à la fin de la requête pour 0 à 10 000 et LIMIT 10000,10000
à la fin de la requête pour 10 000 à 20 000
Alors, comment cela se fait-il dans DB2? Quel est le code et la syntaxe? (un exemple de requête complet est apprécié)
db2
limit
ibm-midrange
elcool
la source
la source
Réponses:
Utilisation
FETCH FIRST [n] ROWS ONLY
:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm
Pour obtenir des plages, vous devez utiliser
ROW_NUMBER()
(depuis la v5r4) et l'utiliser dans laWHERE
clause: (volé à partir d'ici: http://www.justskins.com/forums/db2-select-how-to-123209.html )la source
ROW_NUMBER
n'est pas un mot clé valide. Mais merci pour le lien, ça m'a donné une idée et ça marche.Développé cette méthode:
Vous BESOIN d'une table qui a une valeur unique qui peut être commandée.
Si vous voulez des lignes de 10 000 à 25 000 et que votre table comporte 40 000 lignes, vous devez d'abord obtenir le point de départ et le total des lignes:
int start = 40000 - 10000;
int total = 25000 - 10000;
Et puis passez-les par code à la requête:
la source
La prise en charge de OFFSET et LIMIT a été récemment ajoutée à DB2 pour i 7.1 et 7.2. Vous avez besoin des niveaux de groupe DB PTF suivants pour obtenir cette prise en charge:
Voir ici pour plus d'informations: documentation OFFSET et LIMIT , DB2 for i Enhancement Wiki
la source
Voici la solution que j'ai trouvée:
En initialisant LASTVAL à 0 (ou «» pour un champ de texte), puis en le définissant sur la dernière valeur du jeu d'enregistrements le plus récent, cela fera défiler la table par blocs de N enregistrements.
la source
N
est plus petit que le nombre de valeurs identiques dans la colonne (bien que cela soit vrai lors de l'utilisationROW_NUMBER()
aussi). Les valeurs initiales doivent également être choisies avec soin - ce0
sera évidemment problématique si la colonne contient une valeur négative . Des précautions seraient nécessaires avec les valeurs nulles. Ne fonctionnera pas si les pages sont ignorées.La solution de @ elcool est une idée intelligente, mais vous devez connaître le nombre total de lignes (qui peut même changer pendant que vous exécutez la requête!). Je propose donc une version modifiée, qui nécessite malheureusement 3 sous-requêtes au lieu de 2:
où
{last}
doit être remplacé par le numéro de ligne du dernier enregistrement dont j'ai besoin et{length}
doit être remplacé par le nombre de lignes dont j'ai besoin, calculé comme suitlast row - first row + 1
.Par exemple, si je veux des lignes de 10 à 25 (au total 16 lignes), ce
{last}
sera 25 et{length}
sera 25-10 + 1 = 16.la source
Vous devez également considérer la clause OPTIMIZE FOR n ROWS. Plus de détails sur tout cela dans la documentation DB2 LUW dans la rubrique Directives pour la restriction des instructions SELECT :
la source
Essaye ça
la source
Il existe 2 solutions pour paginer efficacement sur une table DB2:
1 - la technique utilisant la fonction row_number () et la clause OVER qui a été présentée sur un autre article ("SELECT row_number () OVER (ORDER BY ...)"). Sur certaines grandes tables, j'ai remarqué parfois une dégradation des performances.
2 - la technique utilisant un curseur à défilement. L'implémentation dépend de la langue utilisée. Cette technique semble plus robuste sur les grandes tables.
J'ai présenté les 2 techniques implémentées en PHP lors d'un séminaire l'année prochaine. La diapositive est disponible sur ce lien: http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf
Désolé mais ce document est uniquement en français.
la source
Theres ces options disponibles: -
la source