¿Cuál es la forma más eficiente de obtener datos para una lista grande de un RDMS?

Estoy trabajando en un sistema con miles de elementos que deben presentarse al usuario para su selección. Cada elemento de línea que se muestra consta de una gran cantidad de datos y opciones/enlaces y tiene que leer muchas tablas en una base de datos para representar toda la información y los enlaces en la línea. Y hay miles de líneas.

Entonces, obviamente, filtramos o paginamos o de alguna manera limitamos el conjunto de datos resultante porque realmente no necesitamos mostrar 4000 elementos en la página cuando el usuario solo va a elegir uno.

Digamos que paginamos. El problema que veo aquí es que para mostrar la página 3, por ejemplo, tenemos que saber cuántos elementos por página y luego, de alguna manera, hacer un sql que recupere solo el valor de 3 páginas de una página. Tenga en cuenta que la lista para mostrar puede ser ordenados por cualquiera de las muchas columnas de datos, por lo que me parece que tenemos que solicitar el conjunto de resultados completo de la base de datos y luego, en el programa, seleccionar solo los elementos de la página 3 que queremos, porque no hay manera de decir en SQL dame filas 30-40 de seleccionar bla, bla, bla orden por x, y, z.

Luego está el problema de obtener los datos. Puedo hacerlo de una sola vez obteniendo todos los datos que necesitaré y luego seleccionar las filas 30-40 que obtengo, pero eso es mucho trabajo en la base de datos, la mayor parte del cual voy a desechar.

Entonces, en su lugar, tal vez haga una pasada para obtener la lista de identificadores, y luego haga otro sql mucho más complicado para obtener todos los datos que necesito para esas 10 filas a través de una cláusula IN en algún identificador de fila (es mejor que esté en el PK) . Hacer dos pases para una página suena como una idea muy lenta. También encuentro que cuanto más trabajo le pido a la base de datos, más se enoja mi DBA conmigo. Entonces, lo ideal sería volcar la mayor cantidad de trabajo posible en el servidor de aplicaciones, pero eso, por supuesto, significa extraer una gran cantidad de datos a través de la red desde la base de datos hasta el servidor de aplicaciones, lo que también es una solución lenta.

Entonces, ¿esa es la mejor manera? ¿O hay otro paradigma que funciona mejor?

Ahora digamos que estamos filtrando. El usuario tiene algunos criterios de filtro que puede seleccionar. Nos encontramos con el mismo problema, donde el usuario puede eliminar todos los filtros y luego terminaré cargando 4000 filas realmente intensivas en datos de la base de datos, lo que prácticamente requiere que haga la paginación de todos modos.

El objetivo aquí es tener tiempos de página rápidos como los de Google mientras se ve obligado a leer muchos datos de muchas tablas para poder representar una página de información.

Con el tiempo me he dado cuenta de que lo que hace Google no es tan complejo. Y con eso quiero decir que el conjunto de resultados de una página de búsqueda tiene un conjunto de datos bastante limitado. No cuestiono que la forma en que obtienen esos datos sea muy compleja, pero cualquier resultado de búsqueda dado no se compone de tanta información.

Mi problema es que tengo mucha información en cada línea de la página que estoy mostrando, y estoy limitado por la limitación de que todos mis datos se distribuyen en un montón de tablas y bases de datos.

Entonces, aunque me doy cuenta de que con la infraestructura que tengo nunca lograré tiempos de respuesta similares a los de Google, ¿cuál es la mejor manera de representar los datos de una página desde una base de datos?

preguntado el 28 de agosto de 12 a las 14:08

1 Respuestas

En realidad, hay una forma de que la base de datos diga "Dame las filas 30-40 de mi consulta". lo que buscas es LIMIT y OFFSET. Esta es probablemente la mejor solución: permite que la base de datos haga lo que mejor se le da.

Documentación para LIMIT y OFFSET.

Además, parece que está en una posición perfecta para pensar en el almacenamiento en caché. Tiene un conjunto de consultas extremadamente costosas, pero no parece que cambien rápidamente; usar algo como Memcached para mantener una copia de los resultados de su consulta podría ser útil.

Respondido 28 ago 12, 22:08

Interesante idea, memcached. Buscaré el límite y la compensación, siempre pensé que cosas como esas eran extensiones específicas de db, no SQL estándar, pero lo comprobaré. - user1630313

ahhh, veo que es una cosa postgresql. No es una expresión sql universal. - user1630313

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.