2010-11-30 25 views
5

Búsqueda a través de stackoverflow Encontré una gran cantidad de respuestas que condenan el uso de cursores en la programación de bases de datos. Sin embargo, realmente no entiendo cuál es la alternativa.¿Cuál es la alternativa a los cursores para recuperar grandes cantidades de datos de una base de datos?

Estoy creando un programa que lee un gran número de filas (cientos de miles) de la base de datos y las mantiene en la memoria, por motivos de rendimiento. Realmente no puedo ejecutar una tabla SELECT * FROM y procesar todos los resultados a la vez, ¿o sí?

La mejor manera que he encontrado es usar cursores y recuperar las filas en incrementos, por ejemplo 10 a la vez.

¿Podría alguien aclararme? Yo uso PostgreSQL 9 en Linux.

Gracias

Respuesta

1

Un cursor es la mejor opción cuando se tiene que hacer frente a grandes cantidades de datos. También puede usar el método LIMIT .. OFFSET .., pero esto será cada vez más lento, dependiendo de la cantidad de datos. PostgreSQL no tiene ningún problema con los cursores, úselas cuando maneja grandes cantidades de datos.

SQL Server tiene/tuvo problemas con los cursores, MySQL no puede manejar los cursores fuera de las funciones almacenadas, esa podría ser la razón por la que a algunos dba no les gustan los cursores.

1

Puede utilizar el bucle for recto uso de registro:

do 
$$ 
declare r record; 

begin 

    for r in select product_id, name from products loop 
     raise notice '% %', r.product_id, r.jname; 
    end loop; 

end$$ 
1

supongo que la mejor manera es utilizar COPY para obtener los datos necesarios directamente a la aplicación cliente.

Tampoco tuve ningún problema al utilizar los cursores. Hasta donde yo entiendo, el cursor está guardando una instantánea de los datos para usted, y formalmente (y COPY) es la única forma correcta de revisar los resultados, ya que de lo contrario, al usar LIMIT..OFFSET puede ocasionar inconsistencias, ya que la compensación es modificada por los registros recién insertados.

0

Debería ser raro que necesite un cursor. Tal vez si su lógica cambia a medida que se actualiza cada fila anterior, es posible que necesite un cursor.

¿Realmente necesita abrir un cursor para su problema? ¿Puedes darnos los detalles de lo que estás tratando de hacer? Los grandes conjuntos de datos son una buena razón para evitar los cursores, no es una razón para usarlos.

Debe intentar hacer el procesamiento basado en conjunto. Solo actualizaciones regulares en las tablas, con combinaciones y filtros.

¿Puede una actualización simple reemplazar el bucle del cursor?

+0

No quiero actualizar los datos. Quiero mantenerlos en la memoria en las estructuras de datos por razones de rendimiento. Así que quiero transferirlos a granel de la base de datos a un proceso. ¿Hay una alternativa de cursor para eso? –

0

Si solo está descargando datos, ¿por qué no utilizar seleccionar? No está guardando ninguna memoria tirando de 10 filas a la vez porque de todos modos lo almacena en la memoria caché.

¿Echo de menos algo?

Cuestiones relacionadas