¿Cómo le va LIMIT
en DB2 para iSeries?
Tengo una tabla con más de 50,000 registros y quiero devolver registros de 0 a 10,000 y registros de 10,000 a 20,000.
Sé que en SQL escribe LIMIT 0,10000
al final de la consulta de 0 a 10,000 y LIMIT 10000,10000
al final de la consulta de 10000 a 20,000
Entonces, ¿cómo se hace esto en DB2? ¿Cuál es el código y la sintaxis? (se agradece el ejemplo de consulta completo)
db2
limit
ibm-midrange
elcool
fuente
fuente
Respuestas:
Usando
FETCH FIRST [n] ROWS ONLY
:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm
Para obtener rangos, tendría que usar
ROW_NUMBER()
(desde v5r4) y usar eso dentro de laWHERE
cláusula: (robado de aquí: http://www.justskins.com/forums/db2-select-how-to-123209.html )fuente
ROW_NUMBER
no es una palabra clave válida. Pero gracias por el enlace, me dio una idea y funciona.Desarrolló este método:
NECESITA una tabla que tenga un valor único que se pueda pedir.
Si desea filas de 10,000 a 25,000 y su tabla tiene 40,000 filas, primero debe obtener el punto de partida y las filas totales:
int start = 40000 - 10000;
int total = 25000 - 10000;
Y luego pase estos por código a la consulta:
fuente
Recientemente se agregó soporte para OFFSET y LIMIT a DB2 para i 7.1 y 7.2. Necesita los siguientes niveles de grupo DB PTF para obtener este soporte:
Consulte aquí para obtener más información: documentación de OFFSET y LIMIT , DB2 para i Enhancement Wiki
fuente
Aquí está la solución que se me ocurrió:
Al inicializar LASTVAL en 0 (o '' para un campo de texto), luego establecerlo en el último valor en el conjunto de registros más reciente, esto recorrerá la tabla en trozos de N registros.
fuente
N
sea menor que el número de valores idénticos en la columna (aunque esto también es cierto cuando se usaROW_NUMBER()
). Los valores iniciales también deben elegirse con cuidado;0
obviamente, será problemático si la columna contiene un valor negativo . Se necesitaría cuidado con los nulos. No funcionará si se saltan las páginas.La solución de @elcool es una idea inteligente, pero necesita saber el número total de filas (¡que incluso puede cambiar mientras ejecuta la consulta!). Entonces propongo una versión modificada, que desafortunadamente necesita 3 subconsultas en lugar de 2:
donde
{last}
debe reemplazarse con el número de fila del último registro que necesito y{length}
debe reemplazarse con el número de filas que necesito, calculado comolast row - first row + 1
.Por ejemplo, si quiero filas de 10 a 25 (en total 16 filas),
{last}
será 25 y{length}
será 25-10 + 1 = 16.fuente
También debe considerar la cláusula OPTIMIZE FOR n ROWS. Más detalles sobre todo esto en la documentación de DB2 LUW en el tema Directrices para restringir sentencias SELECT :
fuente
Prueba esto
fuente
Hay 2 soluciones para paginar de manera eficiente en una tabla DB2:
1 - la técnica que utiliza la función número_fila () y la cláusula OVER que se ha presentado en otra publicación ("SELECT número_fila () OVER (ORDER BY ...)"). En algunas mesas grandes, a veces noté una degradación de las actuaciones.
2 - la técnica que utiliza un cursor desplazable. La implementación depende del idioma utilizado. Esa técnica parece más sólida en mesas grandes.
Presenté las 2 técnicas implementadas en PHP durante un seminario el próximo año. La diapositiva está disponible en este enlace: http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf
Lo siento, pero este documento solo está en francés.
fuente
Hay estas opciones disponibles: -
fuente