Una de las tareas de mantenimiento que se deben realizar en las bases de datos, especialmente en las que tienen tablas con muchos millones de filas, es la del sweep.

Pero ¿cuál es la manera correcta de realizar esa tarea?

Primero, debemos recordar que el sweep se encarga de eliminar toda la basura que se haya acumulado dentro de la Base de Datos a causa de la ejecución de los comandos UPDATE y DELETE. Siempre que se ejecuta el comando UPDATE o el comando DELETE se deja basura dentro de la Base de Datos, sin importar que la transacción haya finalizado con un COMMIT o con un ROLLBACK; por lo tanto, en algún momento deberemos eliminar esa basura.

Segundo, un sweep automático es realizado por el Firebird cada vez que creamos un backup usando el programa GBAK. Por lo tanto, no siempre es necesario realizar un sweep manual, aunque debemos recordar que el sweep automático también puede fallar y por lo tanto también deberemos verificarlo.

Tercero, tanto si realizamos un sweep manual como un sweep automático debemos comprobar que fue completado exitosamente. ¿Por qué? Porque si no fue completado exitosamente entonces dentro de nuestra Base de Datos habrá quedado mucha basura y eso hará que las tareas que se realicen en ella sean mucho más lentas de lo que deberían ser.

Pasos a seguir:

  1. Verificar si es necesario realizar el sweep
  2. Realizar el sweep
  3. Comprobar si el sweep fue completado exitosamente
  4. Si descubrimos que hay problemas, buscar y corregir esos problemas

Paso 1. Verificar si es necesario realizar el sweep

Desde luego que este paso solamente lo hacemos antes de realizar un sweep manual. El programa GSTAT con la opción -h nos da la información que estamos necesitando.

sweep01

Captura 1. Si haces clic en la imagen la verás más grande

En la Captura 1. vemos que la diferencia entre la Oldest Transaction y la Next Transaction es muy grande. Eso puede ocurrir normalmente y no está mal que ocurra cuando hay muchos usuarios conectados y trabajando con la Base de Datos. Pero si no hay otros usuarios conectados o hay muy pocos usuarios conectados es un indicador de que hay mucha basura acumulada dentro de la Base de Datos. Una regla rápida que podemos usar es la siguiente: «si hay hasta 10 transacciones faltantes por cada usuario conectado, es aceptable». ¿Por qué? porque en general los usuarios ejecutan muchos comandos INSERT y muchos comandos SELECT, y muy pocos comandos UPDATE o DELETE. Estos dos últimos comandos son los que colocan basura dentro de la Base de Datos. Desde luego que esta regla rápida no se aplica a todos los casos, ya que cada caso es un caso, y habrá aplicaciones que realizan legítimamente muchos UPDATE y muchos DELETE y así en lugar de 10 transacciones faltantes por cada usuario la cantidad podría ser de 100, de 1000, o incluso más.

En el caso de la Captura 1. vemos que la Oldest Transaction es 60325 y que la Next Transaction es 71820, siendo la diferencia entre ellas de 11495, un número muy grande de transacciones faltantes. Como la aplicación que usa esa Base de Datos realiza pocos UPDATE y pocos DELETE entonces es un indicador de que un sweep es requerido.

Paso 2. Realizar el sweep

Un sweep manual se realiza mediante el programa GFIX con la opción -sweep

sweep02

Captura 2. Si haces clic en la imagen la verás más grande

Como puedes ver, el programa GFIX no te da información sobre la tarea que realizó. Lo positivo es que si no muestra un mensaje significa que finalizó ok.

Paso 3. Comprobar si el sweep fue completado exitosamente

Después de haber ejecutado el programa GFIX con la opción –sweep debemos conectarnos a nuestra Base de Datos, iniciar una transacción, y finalizar esa transacción con el comando COMMIT. Esto es necesario para que se muevan los identificadores de las transacciones.

 sweep04

Captura 3. Si haces clic en la imagen la verás más grande

Desde luego que no es necesario usar el programa ISQL para iniciar una transacción y finalizarla con un COMMIT. Cualquier programa que pueda conectarse a la Base de Datos servirá muy bien. Lo importante es iniciar una transacción y finalizarla con un COMMIT, para así mover los identificadores de las transacciones. Cual programa usar es lo de menos.

sweep05

 

Captura 4. Si haces clic en la imagen la verás más grande

En la Captura 4. hemos vuelto a ejecutar el programa GSTAT con la opción -h y así podemos observar que los identificadores de las transacciones están todos ok. Los identificadores están todos ok cuando la diferencia entre ellos es de 1 ó máximo de 2.

Paso 4.  Si descubrimos que hay problemas, buscar y corregir esos problemas

Si los identificadores de las transacciones no están todos ok (o sea, la diferencia entre ellos es más que 2 y no había otros usuarios conectados a la Base de Datos cuando se realizó el sweep), eso significa que el sweep no eliminó a toda la basura. ¿Y por qué no eliminó a toda la basura? La razón más frecuente es que hay una transacción (o más de una transacción) cuyo acceso es READ WRITE (o sea, que la transacción puede escribir en la Base de Datos) y esa transacción hace mucho tiempo que se inició y aún no ha finalizado con un COMMIT ni con un ROLLBACK. Otra razón, mucho más dolorosa, es que la Base de Datos está corrupta.

En estas circunstancias (es decir, cuando los identificadores no están todos ok) debemos ejecutar el programa GFIX con las opciones -validate y -full

sweep06

Captura 5. Si haces clic en la imagen la verás más grande

Si queremos conocer cuales son las transacciones que hace mucho tiempo se iniciaron y aún no han finalizado ni con un COMMIT, ni con un ROLLBACK, podemos escribir el siguiente comando:

Listado 1.

SELECT
   MON$TRANSACTION_ID,
   MON$TIMESTAMP
FROM
   MON$TRANSACTIONS
ORDER BY
   MON$TRANSACTION_I

Y para eliminar a la transacción problemática, podemos escribir:

Listado 2.

DELETE FROM
   MON$TRANSACTIONS
WHERE
   MON$TRANSACTION_ID = NúmeroTransacciónProblemática

Si las transacciones problemáticas son varias, entonces podríamos necesitar repetir estos pasos varias veces.

Conclusión:

Tanto si se realiza un sweep manual como un sweep automático, debemos verificar que al finalizar los identificadores de las transacciones estén todos ok. Los identificadores de las transacciones están todos ok cuando la diferencia entre ellos es de 1 ó de 2, cuando no hay otros usuarios conectados a la Base de Datos. Si los identificadores no están ok, entonces debemos validar la Base de Datos, buscar las transacciones que se están demorando mucho en finalizar y eliminar a esas transacciones.

Artículos relacionados:

Entendiendo los identificadores de las transacciones

Entendiendo sweep y garbage collection

El índice del blog Firebird21

El foro del blog Firebird21