Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Recompilar todos los indices (https://www.clubdelphi.com/foros/showthread.php?t=68596)

Vlady 23-06-2010 00:20:49

Recompilar todos los indices
 
Hola amigos club delphi mi pregunta es como desde delphi es posible recompilar todos los indixes de una tabla despues de hacer un gran numero de actualizaciones.

Es que he al hacer un gran proseso de acualizaciones y eliminaciones el tamaño de la base de datos se duplica y solo se puede regresar al estado final despues de hacer un backup - restore.

Utilizo delphi 7 y firebird 2.0

Gracias.

Casimiro Notevi 23-06-2010 01:32:53

Eso no es por los índices, sino por las transacciones que se van almacenando.
Firebird no necesita reindexar, eso es algo de la época de dBase.
De todas formas, si quieres, puedes rehacer los índices de varias formas:
  • Hacer un backup/restore, como has indicado
  • Desactivando los índices y volviendo a activarlos
  • Recalculando sus estadísticas (lo usa para elegir el plan más adecuado)

Vlady 23-06-2010 03:16:56

Casimiro gracias por tus respuestas:

cual de las soluciones es la mas conveniente

1. Desactivar los indices y volver a activarlos (como se hace desde delphi).
2. Recalculando sus estadisticas (como se hace desde delphi).

Gracias por tu colaboración.

Casimiro Notevi 23-06-2010 13:26:59

Cita:

Empezado por Vlady (Mensaje 368133)
cual de las soluciones es la mas conveniente

Si lo haces por eliminar espacio... ninguna !!!

Como te comenté antes, el aumento del tamaño de la base de datos es normal porque trabaja con transacciones, estas se quedan almacenadas aunque ya se hayan realizado. La única forma de "limpiarla" es haciendo un backup/restore.
Pero, realmente no hace falta, da igual si la BD ocupa más, no afecta para nada su rendimiento. Las BD de mis clientes (donde trabajo) superan todas los 500 Mb, el tamaño medio está por encima de 1 Gb, y algunos han sobrepasado ya los 20 Gb. Hacen backup todos los días automáticamente y una vez por semana (los fines de semana) hacen un backup/restore. Todo automáticamente. Ninguno se queja del rendimiento.

Cita:

Empezado por Vlady
1. Desactivar los indices y volver a activarlos (como se hace desde delphi).
2. Recalculando sus estadisticas (como se hace desde delphi).


Para recalcular las estadísticas (index selectivity) para los planes, que no tiene nada que ver con el tamaño de la BD, algo así:

Código Delphi [-]
procedure TfrmRecalcularPlanes.btAceptarClick(Sender: TObject);
begin
//  inherited;
    if caiMensajeConfirmacion('¿Desea recalcular las estadísticas de uso de índices?' ) <> mrYes then
        exit;
    btAceptar.Enabled := false;
    btCancelar.Enabled := false;
    //
    try
        with qrConsulta do
        begin
            Close;
            SelectSQL.Text := 'Select * from RDB$INDICES where RDB$STATISTICS is not null';
            Open;
            Last;
            pbProgreso.Max := qrConsulta.RecordCount;
            First;
        end;
        while not qrConsulta.Eof do
        begin
            qrSql.Close;
            qrSql.Sql.Text := 'Set statistics index '+qrConsulta.FieldByName('RDB$INDEX_NAME').AsString;
            qrSql.ExecQuery;
            //
            qrConsulta.Next;
            pbProgreso.StepIt;
        end;
        //
    finally
        pbProgreso.Position := 0;
        btCancelar.Enabled := true;
    end;
    caiMensajeInformacion('Proceso concluido');
    close;
end;

Para activar o desactivar todos los índices, algo así:

Código:

  Para desactivar todos los índices:

  UPDATE rdb$indices
    SET rdb$index_inactive = 1

  Para activar todos los índices:

  UPDATE rdb$indices
    SET rdb$index_inactive = 0


Vlady 23-06-2010 22:40:41

Casimiro muchas gracias por dar algo de tu sabiduria..
No se porq motivo el programa q esta hecho en delphi7 queda muy lento despues de hacer el proceso de actualizacion que se hace cada 8 dias a varias tablas este proceso duplica y en algunos casos triplica el tamaño de la base de datos y la unica solucion es hacer un backup/restore que demora demansiado haciendose hasta 1/2 hora una vez hecho esto el tamaño de la DB regresa al tamaño inicial y el programa trabaja correctamente. A que se debera esto? Lo que no entiendo es porque si al hacer el proceso cada uno de las transacciones tiene un CommitRetaining. Entonces como puedo hacer para que no crezca el tamaño tan explosivamente de la base de datos.

Casimiro Notevi 24-06-2010 00:21:11

Como te he comentado antes, el tamaño de la base de datos cuando se está usando, aumenta por las transacciones, da igual que hagas commit, eso sólo sirve para "confirmar" la grabación, pero las transacciones se han hecho y se quedan almacenadas aunque no sirve ya para nada.
Pero como también te he comentado antes, no influye para nada en el rendimiento de la misma.
Necesitaría muchos más datos para darte un diagnóstico, pero si ese proceso que comentas inserta muchísimos registros, entonces puede que los índices queden "desbalanceados", se soluciona desactivándolos y volviendo a activarlos o haciendo un backup y restore.
También puede ser un cúmulo de circusntancias, por ejemplo: windows, disco duro "lento", disco muy lleno, etc. tras hacer muchas entradas de datos puede quedar la base de datos muy fragmentada, dispersa por todo el disco.
En fin, pueden ser varios factores o la suma de algunos de ellos.

Y, vuelvo a repetir, el tamaño de la base de datos no es un factor importante para el rendimiento.

maeyanes 24-06-2010 19:50:04

Hola...

El problema podría ser que usas CommitRetaining y no Commit, también cuando se trata de actualizaciones másivas, es mejor hacer Commit después de un numero determinado de actualizaciones/inserciones (500 o 1,000 registros).



Saludos...

Casimiro Notevi 24-06-2010 20:03:39

Cita:

Empezado por maeyanes (Mensaje 368239)
Hola...
El problema podría ser que usas CommitRetaining y no Commit, también cuando se trata de actualizaciones másivas, es mejor hacer Commit después de un numero determinado de actualizaciones/inserciones (500 o 1,000 registros).
Saludos...

Con commit le va a cerrar la conexión. Por lo demás, no varía en nada.
Y sigo insistiendo, es independiente el tamaño de la base de datos con su rendimiento.

maeyanes 24-06-2010 20:10:14

Hola...

Tanto así como la conexión, no, tal vez los DataSet's y le afectaría dependiendo de como está haciendo el proceso.

Y tienes razón con el detalle del tamaño vs rendimiento.

Yo he hecho procesos para actualizaciones/inserciones másivas y si bien la base de datos crece, no lo hace de forma tan desproporcionada, claro, yo los hago mayormente usando sentencias mediante queries y no vía dataset's y los commits los realizo luego de varios registros.


Saludos...

Casimiro Notevi 24-06-2010 20:16:32

Cita:

Empezado por maeyanes (Mensaje 368242)
[..] Tanto así como la conexión, no, tal vez los DataSet's y le afectaría dependiendo de como está haciendo el proceso.[..]

Eso, los datasets :)


La franja horaria es GMT +2. Ahora son las 07:16:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi