Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Por cierto, yo en FIBPlus pongo un TimeOut de 1 a mis transacciones para asegurarme de que nunca queden abiertas. No sé si en IBX tienes algo similar.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #2  
Antiguo 19-11-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 24
Toni Va por buen camino
Hola,

respecto a esto:

Cita:
Por cierto, para las consultas de modificacion, insercion y/o procedimientos alm. como los utilizais con los clientdataset para sincronizar todo en una transaccion?
Creo que no me he explicado correctamente, quiero decir que yo utilizo los clientdataset para consultas y consultas modificables y realizo un applyupdates para grabar todos los cambios.

Pero cuando en el mismo proceso de guardar esos cambios quiero incluir en una misma transaccion una actualizacion o insercion mediante instrucciones SQL (insert, update) o un procedimiento almacenado.

Por ejemplo solamente con componentes IBX lo haria asi:

Código:
/* componente IBQuery + IBUpdateSQL*/
IBXQuery->Edit();
IBXQuery->FieldByName("Ejercicio")->AsInteger = Ejercicio;
IBXQuery->Post();

/* insert, update o procedimiento */
IBXQuery2->ParamByName("P_EJERCICIO")->AsInteger = Ejercicio;
IBXQuery2->ExecSQL();

TIBTransaction->Commit(); /* Confirmo todas las operaciones anteriores */
utilizando los clientdataset:

Código:
ClientDataSet->Edit();
ClientDataSet->FieldByName("Ejercicio")->AsInteger = Ejercicio;
ClientDataSet->Pots();

/* insert, update o procedimiento */
IBXQuery2->ParamByName("P_EJERCICIO")->AsInteger = Ejercicio;
IBXQuery2->ExecSQL();

ClientDataSet->ApplyUpdates(-1);
TIBTransaction->Commit(); /* Confirmo todas las operaciones anteriores */
__________________
Saludos,

Bitman
Responder Con Cita
  #3  
Antiguo 19-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola.

Yo te recomendaría que definas una sola transacción y que la controles manualmente (la inicies y la finalices tú, en lugar de dejar que se haga implícitamente).

Cita:
Empezado por Toni Ver Mensaje
Código:
IBTransaction->StartTransaction();

ClientDataSet->Edit();
ClientDataSet->FieldByName("Ejercicio")->AsInteger = Ejercicio;
ClientDataSet->Post();
ClientDataSet->ApplyUpdates(-1);

IBXQuery->ParamByName("P_EJERCICIO")->AsInteger = Ejercicio;
IBXQuery->ExecSQL();

IBTransaction->Commit();
NOTA: No utilizo IBX, pero debería ser algo así.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #4  
Antiguo 22-11-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 24
Toni Va por buen camino
Hola,

He probado a ir aislando los problemas y finalmente lo que me engorda la base de datos es la ejecuccion de un procedimiento almacenado que realiza calculos sobre tablas de forma 'masiva'. Algo similiar a esto pero 5 veces con diferentes tablas.

Código:
   for select "Campo1", "Campo2" from "Tabla1"
   where "Campo5"=:P_PARAM and "Campo5"<>'F' group by "Campo1", "Campo2"
   into :P_PARAM2, :P_PARAM3
    do
     begin
      update "Tabla2" U set "Campo6"='A'
      where U."Campo1"=:P_PARAM and U."Campo2"=:P_PARAM2 and U."Campo3" = :P_PARAM;
     end

Incluso si lo ejecuto desde el IBManager me engorda la base de datos. Aunque lo que realmente me importa no es el tamaño de base de datos, sino que por algun motivo este engorde afecta al 'rendimiento brutalmente'.

Tambien he probado a realizar el cambio de paginado que me comentaba Casimiro, pero al realizar el cambio con la nueva base de datos con el tamañp de paginado a 8192, me empezo a realizar unos extraños (cambiar masivamente el estado de diferentes documentos) y tuve que recuperar la copia de seguridad que habia realizado justo antes. La verdad que no le pude encontrar otra explicacion a la incidencia. No se si tenia que haber cerrado el servicio de FB al realizar el cambio de base de datos.

Muchas gracias por las aportaciones.
__________________
Saludos,

Bitman

Última edición por Toni fecha: 22-11-2010 a las 15:51:52.
Responder Con Cita
  #5  
Antiguo 22-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola Toni.

¿ Cuantos registros hay involucrados en ese procedimiento almacenado ?.

Si la Base de Datos crece exageradamente, es que se están modificando de golpe una cantidad desorbitada de registros, lo cual ocurre lógicamente en una única transacción con lo que crece la base de datos por el versionado de esos registros (y también explica la caída de rendimiento).

¿ Estás seguro que no hay triggers enmedio que te están forzando la actualización inesperada de más registros en otras tablas ?.

Será mejor que revises el código para ver si en ese procedimiento almacenado no estás haciendo muchísimas más actualizaciones de las necesarias.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #6  
Antiguo 23-11-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 24
Toni Va por buen camino
Hola Guillotmarc,

Como comentaba este procedimiento recalcula (suma y agrupa el contenido de unas tablas y actualiza con el resultado otras) las tablas que agrupan tienen al rededor de 11000 registros y la que actualiza tambien.

He comprobado que no hay triggers implicados.

Se que esto no es lo mas optimo, pero inicialmente funciona bastane bien. A medida que va 'acumulando' versiones de los registros y va aumentando el tamaño de la base de datos, cuando el tamaño se multiplicado ya 5 el rendimiento cae en picado.

¿Pero estos registros no tendrian que influirle tanto, no?

¿la unica manera de mejorar el rendimiento sera hacer backup-restore?

Muchas gracias.
__________________
Saludos,

Bitman
Responder Con Cita
  #7  
Antiguo 23-11-2010
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Habría que ver cómo es ese procedimiento. Tendrías que ver si puedes aplicar esta idea a tu procedimiento:
Código SQL [-]
/*Por cada registro tratado hago un update*/
declare variable importe double precision;
begin
   for select importe from tabla
       where ...
       into :importe
   do
   begin
       update totales 
       set importe=importe + :importe
       where ...;
   end
end
Código SQL [-]
/*Acumulo en una variable y hago un solo update final*/
declare variable importe double precision;
declare variable total double precision;
begin
   for select importe from tabla
       where ...
       into :importe
   do
   begin
       Total = Total + importe;
   end
   update totales 
   set importe=total
   where ...;
end
Responder Con Cita
  #8  
Antiguo 23-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Cita:
Empezado por Toni Ver Mensaje
Hola Guillotmarc,

Como comentaba este procedimiento recalcula (suma y agrupa el contenido de unas tablas y actualiza con el resultado otras) las tablas que agrupan tienen al rededor de 11000 registros y la que actualiza tambien.

He comprobado que no hay triggers implicados.

Se que esto no es lo mas optimo, pero inicialmente funciona bastane bien. A medida que va 'acumulando' versiones de los registros y va aumentando el tamaño de la base de datos, cuando el tamaño se multiplicado ya 5 el rendimiento cae en picado.

¿Pero estos registros no tendrian que influirle tanto, no?

¿la unica manera de mejorar el rendimiento sera hacer backup-restore?

Muchas gracias.
Todo apunta a que sigues teniendo como mínimo una transacción que se queda siempre abierta, por lo que no se puede ejecutar la recolección de basura de Firebird, y no se recupera el espacio usado por el versionado de productos, aparte de finalmente caerse el rendimiento de la base datos.

Tienes todos los síntomas relatados en este artículo de Firebird :

http://www.ibphoenix.com/main.nfs?a=...x&page=ibp_oit

Tienes que revisar todas las transacciones de tu programa, y verificar que se finalicen inmediatamente una vez terminada su tarea. Nunca dejes transacciones abiertas a la espera de que el usuario haga algo, y no confíes en las transacciones implícitas de los componentes, puesto que si hay una transacción abierta, ejecutarán su consulta dentro de esa transacción y la dejarán como estaba, es decir abierta. Programa tu mismo el inicio y commit de las transacciones en cada actualización de la base de datos.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 23-11-2010 a las 11:58:04.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
rendimiento de PHP Ñuño Martínez PHP 1 20-09-2006 06:29:55
Problema grave de rendimiento ACK Firebird e Interbase 13 12-09-2005 17:10:44
¿ Cúal es el Rendimiento ? sierraja Firebird e Interbase 7 12-09-2005 15:37:44
Rendimiento TStringList Delphius Varios 7 13-06-2005 07:16:46
rendimiento carlomagno Firebird e Interbase 14 06-07-2004 17:05:13


La franja horaria es GMT +2. Ahora son las 06:14:06.


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