2010-02-12 20 views
8

Tengo un proceso de sincronización de aplicaciones móviles. La transacción realiza muchas modificaciones en la base de datos. Como esto se hace en el móvil, necesito emitir un VACÍO para compactar la base de datos.¿Debo ejecutar VACUUM en la transacción o después?

Me pregunto cuándo debería emitir un vacío

  • en la transacción, como declaración final
  • o después de la operación?

Actualmente estoy buscando para SQLite, pero si es diferente para otros motores, que me haga saber en las respuestas (PostgreSQL, MySQL, Oracle, SQL Server)

Respuesta

4

Yo diría que fuera de la transacción. Ciertamente, en PostgreSQL, aspiración está diseñado para eliminar las tuplas "muertas" (es decir, la fila de edad cuando un registro ha sido cambiado o eliminado.)

Si está ejecutando vacío en una transacción que tiene registros modificados, estas filas muertos no habrá sido marcado para borrado.

Dependiendo del tipo de VACÍO que esté haciendo, también puede requerir un bloqueo de tabla que bloqueará si hay otras transacciones en ejecución, por lo que podría terminar en una situación de bloqueo (la transacción 1 está bloqueada esperando una bloqueo de tabla para hacer su VACÍO, la transacción 2 se bloquea esperando a que se lance una fila que la transacción 1 ha bloqueado).

También recomendaría que esto no se haga en una aplicación (tal vez como una tarea programada) ya que puede llevar un tiempo completarlo y puede afectar negativamente la velocidad de otras consultas.

En cuanto a SQL Server, no hay VACÍO, lo que está buscando es reducir. Puede activar la reducción automática en 2005, que recuperará espacio automáticamente cuando lo decida el servidor, o emitirá una declaración DBCC para reducir la base de datos y el archivo de registro, pero esto depende de su rutina de respaldo y estrategia por nivel de base de datos.

1

vacío es como desfragmentación, es bueno hacer si Recientemente eliminó muchas cosas, o quizás después de haber insertado muchas cosas, pero de ninguna manera debería hacerlo en cada transacción. Es más lento que casi cualquier otro comando de base de datos y es más una tarea de mantenimiento.

A veces agregamos/eliminamos la mayoría de nuestro archivo db, por lo que un vacío sería una buena idea, pero aún no lo consideraría como parte de la misma transacción que hizo el trabajo.

0

¿Con qué frecuencia se ejecuta la transacción?

Es realmente un tipo de proceso diario, no una consulta por proceso de consulta, pero si lo usa sin estar lleno, entonces puede usarse en una transacción ya que no adquiere un bloqueo.

Si va a hacerlo, entonces debe estar fuera de la transacción, ya que es independiente de la integridad de los datos de las transacciones.

+0

Se realiza después de un proceso de sincronización móvil.La transacción anterior realiza muchas modificaciones en la base de datos. Como esto se hace en el móvil, necesito emitir un VACÍO para compactar la base de datos. – Pentium10

13

quieran o no cuando se utiliza PostgreSQL que no puede ejecutar vacío en la transacción como se indica en la manual:

vacío no puede ser ejecutado dentro de un bloque de transacción.

+0

Gracias, es bueno saberlo para PostgreSQL. – Pentium10

+1

Lo mismo para SQLite: http://www.sqlite.org/lang_vacuum.html – Constantin

Cuestiones relacionadas