¿Cómo consultar el rango de datos en DB2 con el mayor rendimiento?
-
06-07-2019 - |
Pregunta
Por lo general, necesito recuperar datos de una tabla en algún rango; por ejemplo, una página separada para cada resultado de búsqueda. En MySQL uso la palabra clave LIMIT pero en DB2 no lo sé. Ahora uso esta consulta para recuperar el rango de datos.
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
pero sé que es mal estilo. Entonces, ¿cómo consultar el rendimiento más alto?
Solución
Mi requisito ya se ha agregado a DB2 9.7.2.
DB2 9.7.2 agrega una nueva sintaxis para el resultado de la consulta de límite como se ilustra a continuación:
SELECT * FROM TABLE LIMIT 5 OFFSET 20
la base de datos recuperará el resultado de la fila no. 21 - 25
Otros consejos
No estoy seguro de por qué está creando la tabla TMP. ¿No está RUNNING_NO listo en secuencia ascendente? Yo pensaría:
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
daría los mismos resultados.
Tener un ÍNDICE sobre NOMBRE en la tabla EMPLEADO aumentará el rendimiento de esta consulta.
Es muy difícil, depende de la base de datos que tenga.
por ejemplo:
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