Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-06-2010
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 23-06-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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)
Responder Con Cita
  #3  
Antiguo 23-06-2010
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 23-06-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Vlady Ver Mensaje
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
Responder Con Cita
  #5  
Antiguo 23-06-2010
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 24-06-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #7  
Antiguo 24-06-2010
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
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...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #8  
Antiguo 24-06-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por maeyanes Ver Mensaje
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.
Responder Con Cita
  #9  
Antiguo 24-06-2010
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
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...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #10  
Antiguo 24-06-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por maeyanes Ver Mensaje
[..] 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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Recompilar Exodus fide_uci Varios 45 08-04-2010 00:38:53
Activar todos los indices erickperez6 Firebird e Interbase 1 04-03-2010 16:21:10
Recompilar vcl.bpl - bug #9344 juanmdq Varios 0 26-06-2008 13:45:45
Recompilar componente yomismo24 C++ Builder 0 02-10-2007 19:00:59
Activar/Desactivar TODOS los índices abel Firebird e Interbase 2 28-11-2003 15:11:08


La franja horaria es GMT +2. Ahora son las 23:40:36.


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
Copyright 1996-2007 Club Delphi