No estoy tan familiarizado con Oracle como me gustaría. Tengo unos 250k registros y quiero mostrarlos 100 por página. Actualmente tengo un procedimiento almacenado que recupera todos los cuartos de millón de registros en un conjunto de datos utilizando un adaptador de datos, un conjunto de datos y el método dataadapter.Fill (conjunto de datos) en los resultados del proceso almacenado. Si tengo "Número de página" y "Número de registros por página" como valores enteros que puedo pasar como parámetros, ¿cuál sería la mejor manera de recuperar esa sección en particular? Digamos, si paso 10 como número de página y 120 como número de páginas, de la declaración de selección me daría del 1880 al 1200, o algo así, mis matemáticas en mi cabeza podrían estar equivocadas.
Estoy haciendo esto en .NET con C #, pensé que eso no es importante, si puedo hacerlo bien en el lado de SQL, entonces debería estar bien.
Actualización: pude usar la sugerencia de Brian y está funcionando muy bien. Me gustaría trabajar en alguna optimización, pero las páginas aparecen en 4 a 5 segundos en lugar de un minuto, y mi control de paginación pudo integrarse muy bien con mis nuevos procesos almacenados.
fuente
WHERE
no se podían combinar dosAND
, y luego encontré esto: orafaq.com/wiki/ROWNUMPregúntale a Tom sobre paginación y funciones analíticas muy, muy útiles.
Esto es un extracto de esa página:
fuente
En aras de la integridad, para las personas que buscan una solución más moderna, en Oracle 12c hay algunas características nuevas que incluyen una mejor paginación y un manejo superior.
Paginación
La paginación se ve así:
Top N Records
Obtener los mejores récords se ve así:
Observe cómo los dos ejemplos de consulta anteriores tienen
ORDER BY
cláusulas. Los nuevos comandos los respetan y se ejecutan sobre los datos ordenados.No pude encontrar una buena página de referencia de Oracle para
FETCH
o,OFFSET
pero esta página tiene una excelente descripción general de estas nuevas funciones.Actuación
Como señala @wweicker en los comentarios a continuación, el rendimiento es un problema con la nueva sintaxis en 12c. No tenía una copia de 18c para probar si Oracle lo ha mejorado desde entonces.
Curiosamente, mis resultados reales se devolvieron un poco más rápido la primera vez que ejecuté las consultas en mi tabla (113 millones + filas) para el nuevo método:
Sin embargo, como mencionó @wweicker, el plan de explicación se ve mucho peor para el nuevo método:
La nueva sintaxis provocó un escaneo completo del índice en mi columna, que fue el costo total. Lo más probable es que las cosas empeoren mucho al limitar los datos no indexados.
Echemos un vistazo a la hora de incluir una única columna no indexada en el conjunto de datos anterior:
Resumen: utilícelo con precaución hasta que Oracle mejore este manejo. Si tiene un índice con el que trabajar, tal vez pueda utilizar el nuevo método.
Con suerte tendré una copia de 18c para jugar pronto y puedo actualizar
fuente
Solo quiero resumir las respuestas y comentarios. Hay varias formas de realizar una paginación.
Antes de Oracle 12c no existía la funcionalidad OFFSET / FETCH, así que eche un vistazo al documento técnico como sugirió @jasonk. Es el artículo más completo que encontré sobre diferentes métodos con una explicación detallada de las ventajas y desventajas. Tomaría una cantidad significativa de tiempo copiarlos y pegarlos aquí, así que no lo haré.
También hay un buen artículo de los creadores de jooq que explica algunas advertencias comunes con la paginación de Oracle y otras bases de datos. entrada de blog de jooq
Buenas noticias, desde Oracle 12c tenemos una nueva funcionalidad OFFSET / FETCH. Nuevas funciones de OracleMagazine 12c . Consulte "Paginación y consultas Top-N"
Puede verificar su versión de Oracle emitiendo la siguiente declaración
fuente
Intente lo siguiente:
vía [tecnicume]
fuente
En mi proyecto utilicé Oracle 12c y java . El código de paginación se ve así:
fuente