2010-12-23 11 views
6

Tengo una cuadrícula de datos con páginas con más de 10k filas, por lo que es muy lenta cuando se carga por primera vez. ¿Cuál es la mejor manera de resolver este problema? He leído que la paginación JDBC es la solución habitual para tal problema, pero algunas personas dicen que usar SQL ROWNUM es una solución más fácil, así que quería preguntar primero.Cargar una página de datos a la vez

Si cree que la paginación es la mejor solución podría por favor dame un par de consejos sobre cómo pasar sobre él (enlace a implimentation etc)

Respuesta

1

Consulte este enlace sobre consultas de paginación en Oracle.

http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o17asktom-093877.html

Sobre la base de los dos parámetros de entrada ((1) Número de página y (2) el número de resultados que se muestran por página), puede utilizar la consulta para obtener los resultados que necesita.

También verifique la consulta que Don Roby señaló anteriormente. Es igual de bueno, pero quería apuntarle a más información específica de Oracle y cómo se procesa.

0

Puede limitar su conjunto de resultados dentro de su consulta SQL con el límite palabra clave.

Seleccione * de TableName donde id> ... ordene por fieldName asc limit 50;

Seleccione * de TableName donde id < ... ordene por fieldName desc limit 50;

Necesita agregar algo de lógica para la paginación hacia adelante y hacia atrás.

una posible solución es conseguir id del elemento de la lista, bajo para la página anterior, el mayor de la página siguiente, y utilizar sqls similares como anteriormente

+4

Oracle no admite la cláusula 'LIMIT' en SQL sencillo (solo en' BULK COLLECT' AFAIK). Aquí hay muchas respuestas sobre cómo usar 'ROWNUM'. –

0

Se necesitan dos consultas. Serán una variación de estos:

  1. La consulta inicial seleccionar * de nombreTabla donde rownum < = tamaño de página
  2. La consulta paginado seleccionar * de nombreTabla donde indexVal > índice-de- última página y rownum < = tamaño de página

para la consulta inicial, tamaño de página o bien será un duro codificado número o una variable. Para la consulta paginada, index-of-last-page debe ser una variable que pase a la consulta y el tamaño de página puede ser codificado o una variable.

Estas consultas presuponen que no está ordenando los resultados. Si usted está pidiendo el valor de retorno a continuación, las consultas serán una variación de estos:

  1. La consulta inicial SELECT * FROM (SELECT * FROM fin nombreTabla por bla), donde rownum < = tamaño de página
  2. la consulta paginado sELECT * FROM (sELECT * FROM nombreTabla donde indexVal > índice de última página de la orden por bla) rownum < = tamaño de página
2

La localización es adecuada, y la táctica en la primera respuesta al this question debería funcionar para Oracle.

0

para una solución más genérica, debe usar el método Statement.setFetchSize. Por medio de este método, puede limitar el número de registros obtenidos de la base de datos. Por defecto, se están obteniendo todos los registros.

Pero debe tener cuidado al usar este método. Debido a que su conjunto de resultados debe estar activo durante la vida útil de su red.

2

Es una muy buena pregunta, y no hay una sola buena respuesta para cada caso. He usado y visto varias estrategias, cada una de ellas tiene sus pros y sus contras.

Cargando de una vez - bueno, esta es buena con tablas pequeñas, y cuando se filtran los datos. Cuando el usuario navega a otras páginas, no se envían consultas adicionales a la base de datos. El costo bajo negativo al inicio de la interacción y los requisitos de memoria muy pesados. Cuando el typicas es, el usuario no desplazará los datos completos, es el desperdicio de recursos. Sin embargo, para diccionarios pequeños, es probablemente la mejor solución.

Paginación utilizando límite/desplazamiento (PostgreSQL), rownum (Oracle) o cualquiera que sea la palabra clave. El más: tiempo de carga alto para la primera página. El signo menos: cada página siguiente se carga más lentamente, con un trabajo más intenso en el sitio de la base de datos. La mejor estrategia cuando el usuario verá típicamente una o algunas primeras páginas. Lo peor, cuando el usuario se desplazará por todos los datos. Funciona bastante bien cuando el conjunto está ordenado por clave principal, sin embargo, es terrible cuando el conjunto de datos se filtra y ordena, no por índice. Para cada página, invoca el filtrado (de manera reproducible con escaneo completo de tabla) y ordena el conjunto completo de datos en la memoria.

Desplazamiento utilizando el cursor de la base de datos. Esta es la estrategia más peligrosa. La base de datos abre el cursor para consulta y cuando el usuario requiere la página siguiente, el cursor se mueve. La estrategia óptima para el caso, cuando el usuario normalmente se desplaza por todos los datos. La estrategia preferida para los informes. Hovewer, en modo interactivo del usuario, requiere que la conexión de la base de datos sea bloqueada para el momento de la interacción. ¡Nadie más puede usarlo! ¡Y la cantidad de conexiones a la base de datos es limitada! También es muy difícil de implementar en la aplicación web, donde no se sabe si el usuario cerró el navegador o todavía está analizando los datos; no sabe cuándo liberar la conexión.

0

Probablemente esté leyendo registro por registro. Por lo tanto, para cada registro hay dos cambios de contexto:

  • Java -> base de datos Oracle (enviar la solicitud de registro)
  • (Oracle está trabajando)
  • Oracle DB -> Java (devolverá el registro)

Vaya y revise su código y vea si puede encontrar algo en un ciclo for/while, que puede mejorar.

Y también esto: Conozco a alguien que trabaja mucho con Oracle. Me dijo que puedes evitar la mayoría de los bucles escribiendo Consultas inteligentes. Entonces, escribir una buena consulta es una gran mejora en el rendimiento.

1

Lo más fácil es realizar un seguimiento de la página en la que se encuentra y luego a través de SQL especifica el desplazamiento y el límite. En el oráculo, esto se hace mediante indexval y rownum, pero esto no es estándar y otros dbms usan el límite en su lugar.

También puede ir a una base de datos independiente y usar JPA encima de JDBC. La clase Jpa Query admite funciones setFirstResult y setMaxResults para el mismo propósito. Debajo del capó hará los sql respectivos para usted según los dbms que esté utilizando.

Hacer seleccionar conteo() le ayuda a determinar el número de páginas.

Cuestiones relacionadas