Comment interroger une plage de données dans DB2 avec les meilleures performances?
-
06-07-2019 - |
Question
Habituellement, je dois récupérer les données d'une table dans une plage donnée. Par exemple, une page distincte pour chaque résultat de recherche. Dans MySQL, j'utilise le mot clé LIMIT mais dans DB2, je ne le sais pas. Maintenant, j'utilise cette requête pour récupérer une plage de données.
SELECT *
FROM(
SELECT
SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO
, DATA_KEY_VALUE
, SHOW_PRIORITY
FROM
EMPLOYEE
WHERE
NAME LIKE 'DEL%'
ORDER BY
NAME DESC
FETCH FIRST 20 ROWS ONLY
) AS TMP
ORDER BY
TMP.RUNNING_NO ASC
FETCH FIRST 10 ROWS ONLY
mais je sais que c'est mauvais style. Alors, comment interroger pour obtenir les meilleures performances?
La solution
Mes besoins ont déjà été ajoutés à DB2 9.7.2.
DB2 9.7.2 ajoute une nouvelle syntaxe pour le résultat de la requête limite, comme illustré ci-dessous:
SELECT * FROM TABLE LIMIT 5 OFFSET 20
la base de données récupérera le résultat de la ligne no. 21 - 25
Autres conseils
Vous ne savez pas pourquoi vous créez la table TMP. RUNNING_NO n'est-il pas en ordre croissant? Je penserais:
SELECT SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO,
DATA_KEY_VALUE,
SHOW_PRIORITY
FROM EMPLOYEE
WHERE NAME LIKE 'DEL%'
ORDER BY NAME DESC
FETCH FIRST 10 ROWS ONLY
donnerait les mêmes résultats.
Le fait d'avoir un INDEX sur NAME sur la table EMPLOYEE augmentera les performances de cette requête.
C'est très difficile, cela dépend de quelle base de données disposez-vous.
par exemple:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY ID_USER ASC) AS ROWNUM,
ID_EMPLOYEE, FIRSTNAME, LASTNAME
FROM EMPLOYEE
WHERE FIRSTNAME LIKE 'DEL%'
) AS A WHERE A.rownum
BETWEEN 1 AND 25