2012-05-03 12 views
7

¿Es posible hacer muchas actualizaciones en una sola llamada usando Sequel?¿Es posible realizar actualizaciones por lotes en Sequel?

Por ejemplo, hacer aproximadamente 200 actualizaciones podría llevar varios minutos en mi servidor, pero si formo una sola consulta SQL, se ejecutará en cuestión de segundos. Me pregunto si Sequel podría usarse para forjar esa consulta SQL o incluso mejor, hacer toda la operación en una sola toma.

+1

Sí, pero depende de qué es exactamente lo que está tratando de hacer, y lo que RDBMS se está ejecutando en. Proporcione más información para que podamos asesorarlo mejor. –

+0

Estoy usando PostgreSQL, y quiero que Sequel emita una sola consulta para múltiples actualizaciones, como lo puedo hacer en SQL simple. – RooSoft

Respuesta

3

La solución que he encontrado implica el método update_sql. En lugar de realizar la operación en sí, genera consultas SQL sin formato. Para agrupar varias actualizaciones, simplemente únelas con; en el medio, llame al método de ejecución con la cadena resultante y ya está todo listo.

La solución de procesamiento por lotes es MUCHO más rápida que las actualizaciones múltiples.

+1

Esta solución solo es más rápida que las "actualizaciones múltiples", ya que solo realiza una conexión/viaje real a la base de datos para todo el conjunto de actualizaciones, en lugar de una por persona. Tenga en cuenta que algunos marcos de trabajo realizan este tipo de comportamiento de manera automática: mantendrán las actualizaciones en la memoria hasta que se comprometa la transacción. Además, usted podría recibir aún mayores beneficios si se pueden volver a escribir varias declaraciones en una sola declaración. –

+2

Eso puede funcionar en su caso, pero no todos los adaptadores de Sequel admiten múltiples consultas en Ejecución de la base de datos. Sequel en realidad no proporciona un método independiente del adaptador que acepte múltiples consultas en una sola cadena (algunos adaptadores funcionarán con una cadena así, otros no). –

+1

Para el controlador mysql2, tiene que usar {flags: :: Mysql2 :: Client :: MULTI_STATEMENTS} como opción al conectarse – tothemario

5

Puede utilizar Datset#importhttp://sequel.jeremyevans.net/rdoc/classes/Sequel/Dataset.html#method-i-import "inserta varios registros en la tabla asociada. Este método se puede utilizar para insertar de manera eficiente un gran número de registros en una tabla en una sola consulta, si la base de datos lo soporta. Los insertos se envuelven automáticamente una transacción ".

aquí es un ejemplo de cómo se usa:

DB = Sequel.connect(...) 
DB[:movies].import([:id, :director, :title, :year], [[1, "Orson Welles", "Citizen Kane", 1941],[2, "Robert Wiene", "Cabinet of Dr. Caligari, The", 1920]]) 
Cuestiones relacionadas