PDA

Ver la Versión Completa : Optimizar tablar en Firebird


ANDRES86
04-08-2008, 22:43:19
Hola a todos, tengo un problemita, estoy tratando de desfragmentar una tabla en feribird, y cuando ejecuto la sentencia:

OPTIMIZE TABLE nombre_tabla

me aperece un error, operador no reconocido, tambien intente con ANALYZE TABLE, y me dio el mismo.

Alguien sabe como puedo desfragmentar una tabla en firebird, utlizo delphi 7 y firebird 1.5.

gracias de antemano.

RolphyReyes
04-08-2008, 22:49:34
Saludos.

Hasta donde tengo entendido en FB no existe sentencia alguna para lo que deseas realizar, lo que si puedes hacer es un Backup/Restore y esto "desfragmenta" todo.

duilioisola
05-08-2008, 11:36:09
Para optimizar una base Firebird puedes utilizar esto que he sacado de aquí (http://www.clubdelphi.com/foros/showthread.php?t=56725&page=2):


CREATE PROCEDURE SPACTUALIZARINDICES
AS
DECLARE VARIABLE NOMBRE VARCHAR(31);
Begin
For Select RDB$Index_Name From RDB$Indices Into :Nombre Do
Execute Statement 'Set Statistics Index ' || :Nombre;
End


Esto recalcula la selectividad de los índices. (es bueno para que las consultas hagan uso de un buen PLAN)

No se de nada que haga una "defragmentación de tablas".

De todos modos:

Si tu servidor es Windows, realiza una defragmentación del disco cada noche.
Haz un backup y restore antes de hacer algún proceso masivo que vaya a hacer muchos cambios en la base.
Cada tanto haz un backup y restore de la base de datos.
Cada noche haz un backup para que haga un Garbaje collection cuando no hay nadie conectado. (o por lo menos un GFIX -SWEEP)

Para ver como está la base de datos puedes utilizar el GSTAT -H:
Se puede utilizar aunque haya clientes conectados.

WINDOWS
"C:\Archivos de programa\Firebird\Firebird_1_5\bin\gstat" -h basededatos.fdb -user SYSDBA -pass masterkey
LINUX
/opt/firebird/bin/gstat -h /bases/basededatos.fdb

Database "/bases/basededatos.fdb"

Database header page information:
Flags 0
Checksum 12345
Generation 11429
Page size 4096
ODS version 10.1
Oldest transaction 11415
Oldest active 11416
Oldest snapshot 11415
Next transaction 11423
Bumped transaction 1
Sequence number 0
Next attachment ID 0
Implementation ID 19
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 1
Creation date Jan 29, 2008 21:10:28

Variable header data:
Sweep interval: 0
*END*


La diferencia entre "Oldest Active" y "Next Transaction" es lo importante. Son las transacciones abiertas que tienes en ese momento. En este ejemplo 7 Transacciones abiertas. Si superas las 10.000, puede que tu programa no utilice las transacciones correctamente.

Para limpiar transacciones puedes hacer lo siguiente:
Se puede hacer con clientes conectados pero tardará bastante más.

WINDOWS
"C:\Archivos de programa\Firebird\Firebird_1_5\bin\gfix" -sweep basededatos.fdb -user SYSDBA -pass masterkey
LINUX
/opt/firebird/bin/gsfix -sweep /bases/basededatos.fdb