PDA

Ver la Versión Completa : Velocidad en Interbase


BuenaOnda
28-07-2007, 06:59:57
Hola amigos..
Alguien me podria ayudar a resolver un problema que tengo, resulta que ejecuto un procedimiento almacenado en interbase, el problema surge cuando muestra los datos, en el grid resultante, y hago un "scroll" al grid, y se queda "pegado"(se demora mucho), me gustaria saber a que se debe, si existe alguna manera de solucionarlo, para que sea mas rápido, o si se puede refrescar la "memoria" como lo hago en delphi(Application.ProcessMessages), buenos muchas gracias y disculpen tantas preguntas..jijijiji..:D

BuenaOnda
29-07-2007, 02:14:35
sigo con el problemita, cualquier aporte se les agradecera mucho..:D

Caral
29-07-2007, 03:24:45
Hola
Para mi esto depende del componente con que se canecta la base de datos.
Pero recuerda que en esto no soy bueno, es solo una opinion.
Saludos

BuenaOnda
29-07-2007, 03:30:41
Utilizo los componentes IB... para dephi 7... y utilizo Interbase 6.0...

Caral
29-07-2007, 03:36:01
Hola
Si no es el componente, por que IB, es rapido segun dicen, entonces es la cantidad de informacion que trae.
Saludos

BuenaOnda
29-07-2007, 03:49:56
exactamente.. por eso..necesito acelerar el proceso, o de alguna manera.. refrescar los datos resultantes, lo que pasa es que me muestra bien los datos en un "Grid" resultante, pero al momento de deslizarme por los registros resultantes, se demora una barbaridad.. es por eso que necesito..aumentar la velocidad o refrescar los datos resultantes... muchas gracias por tu ayuda..:) ..

Caral
29-07-2007, 04:06:35
Hola
Lo unico que se me ocurre preguntar es con que enlazas, con una IBtable o IBQuery ?
Saludos

BuenaOnda
29-07-2007, 04:16:36
Con un IbQuery, lo que sucede es que los datos no los muestro, solo me interesea obtener el progreso, para mostrar una barrita de estado, para mostrar el progreso de la operacion, ademas si no utilizo un valor de retorno, el procedimiento se demora casi el doble, lo que pasa es que ese procedimiento inserta registro en una tabla temporal...


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
create procedure sp_ctrl_periodo_tarnscurrido
returns (INSERTADOS integer, CONTRATO_ACTUAL integer,
CODIGO_PARTICULAR varchar(20), DESCEQUIPO varchar(150))
as
Declare Variable DiasPaso Integer;
Declare Variable PasoVig Date;
Declare Variable Contador Integer;
Declare Variable Contrato Integer;
Declare Variable FecIni Date;
Declare Variable FecTer Date;
Declare Variable DiasArr Integer;
Declare Variable DiasContrato Integer;
Declare Variable Finqui Varchar(1);
Declare Variable TIPO_FAMILIA integer;
Declare Variable DESCFAMILIA varchar(1);
Declare Variable CODIGO_MANTENCION integer;
Declare Variable DIAS_MANTENCION integer;
Declare Variable TOTAL_DIAS_ARR integer;
Declare Variable FEC_VIGENCIA date;
/*Declare Variable CONTRATO_ACTUAL integer;
Declare Variable CODIGO_PARTICULAR varchar(20);
Declare Variable DESCEQUIPO varchar(150);*/
begin
Insertados=0;
DELETE FROM control_tiempo_transcurrido;

FOR SELECT DISTINCT A.CODIGO_MAQUINA,B.DESCRIPCION
FROM DETALLE_CONTRATOS_DE_ARR A, MAQUINAS B
WHERE A.CODIGO_MAQUINA=B.CODIGO_MAQUINA
INTO :Codigo_Particular,DescEquipo
</SPAN>DO BEGIN
/*FOR SELECT DISTINCT CODIGO_MAQUINA,DESCRIPCION
FROM MAQUINAS
INTO :Codigo_Particular,DescEquipo
</SPAN>DO BEGIN*/

DescFamilia='M';
Tipo_Familia=1;

DIASARR=0;
Contador=0;
DIASCONTRATO=0;
TOTAL_DIAS_ARR=0;
CONTRATO_ACTUAL=0;

FOR SELECT DISTINCT A.Codigo_Contrato,A.Fecha_Vigencia,B.Fecha_Inicio,B.Fecha_Termino,B.Dias_Arrendado,A.Finiquitado
FROM Contratos_de_Arriendo A,Detalle_Contratos_De_Arr B
WHERE B.Codigo_Maquina =:CODIGO_PARTICULAR
AND A.Codigo_Contrato=B.Codigo_Contrato
AND A.Contrato_Anulado='N'
ORDER BY A.Fecha_Contrato Desc
INTO :Contrato,:PasoVig,:FecIni,:FecTer,DiasArr,:Finqui
</SPAN>DO BEGIN

IF( (:Finqui='N')AND(Contador=0) )THEN
BEGIN
SELECT COUNT(*) AS TOTAL
FROM CONTRATOS_DE_ARRIENDO
WHERE CODIGO_CONTRATO =:Contrato
AND Codigo_Maquina =:CODIGO_PARTICULAR
INTO :Contador;

IF(:CONTADOR > 0)THEN
BEGIN
/*SELECT Fecha_Vigencia
FROM CONTRATOS_DE_ARRIENDO
WHERE CODIGO_CONTRATO =:Contrato
AND Codigo_Maquina =:CODIGO_PARTICULAR
INTO :PasoVig; */

FEC_VIGENCIA=:PasoVig;
DIASCONTRATO=('NOW' - FEC_VIGENCIA);
CONTRATO_ACTUAL=:Contrato;
END
END

IF(CONTRATO_ACTUAL <> Contrato)THEN
BEGIN
IF(FecTer >= FecIni)THEN
TOTAL_DIAS_ARR=TOTAL_DIAS_ARR + DiasArr;/* (FecTer - FecIni);*/
ELSE
TOTAL_DIAS_ARR=TOTAL_DIAS_ARR + 0;
END
END

IF(TOTAL_DIAS_ARR > 0 ) THEN
BEGIN
FOR SELECT DISTINCT CODIGO_MANTENCION,DIAS_PARA_LA_MANTENCION
FROM PERIODO_MANTENCIONES
WHERE TIPO_FAMILIA=1
AND CODIGO_PARTICULAR = :CODIGO_PARTICULAR
INTO :CODIGO_MANTENCION,:DIASPASO
DO BEGIN

IF(:CONTRATO_ACTUAL > 0)THEN
DIAS_MANTENCION=:DIASPASO - ('NOW' - FEC_VIGENCIA);
ELSE
DIAS_MANTENCION=:DIASPASO;

Insertados=Insertados + 1;
INSERT INTO control_tiempo_transcurrido(CODIGO_PARTICULAR,TIPO_FAMILIA,DESC_FAMILIA,
DESCRIPCION_PARTICULAR,CONTRATO_ACTUAL,DIAS_CONTRO_ACTUAL,DIAS_ARRENDADO,
CODIGO_MANTENCION,DIAS_MANTENCION)
VALUES(:CODIGO_PARTICULAR,:TIPO_FAMILIA,:DESCFAMILIA,:DescEquipo,:CONTRATO_ACTUAL,
:DIASCONTRATO,:TOTAL_DIAS_ARR,:CODIGO_MANTENCION,:DIAS_MANTENCION);

SUSPEND;
END
END

IF(TOTAL_DIAS_ARR > 0 ) THEN
BEGIN
/*SELECT COUNT(*)
FROM RL_MAQUINAS_COMPONENTES
WHERE CODIGO_MAQUINA=:Codigo_Particular
INTO :Contador;

IF(Contador > 0)THEN
BEGIN */
FOR SELECT DISTINCT A.CODIGO_COMPONENTE,B.DESCRIPCION
FROM RL_MAQUINAS_COMPONENTES A, COMPONENTES B
WHERE A.CODIGO_MAQUINA=:Codigo_Particular
AND A.CODIGO_COMPONENTE=B.CODIGO_COMPONENTE
INTO :Codigo_Particular,DescEquipo
</SPAN>DO BEGIN
DescFamilia='C';
Tipo_Familia=2;
FOR SELECT DISTINCT CODIGO_MANTENCION,DIAS_PARA_LA_MANTENCION
FROM PERIODO_MANTENCIONES
WHERE TIPO_FAMILIA=2
AND CODIGO_PARTICULAR = :CODIGO_PARTICULAR
INTO :CODIGO_MANTENCION,DIASPASO
</SPAN>DO BEGIN

IF(:CONTRATO_ACTUAL > 0)THEN
DIAS_MANTENCION=DIASPASO - ('NOW' - FEC_VIGENCIA);
</SPAN>ELSE
DIAS_MANTENCION=DIASPASO;
</SPAN>
Insertados=Insertados + 1;
INSERT INTO control_tiempo_transcurrido(CODIGO_PARTICULAR,TIPO_FAMILIA,DESC_FAMILIA,
DESCRIPCION_PARTICULAR,CONTRATO_ACTUAL,DIAS_CONTRO_ACTUAL,DIAS_ARRENDADO,
CODIGO_MANTENCION,DIAS_MANTENCION)
VALUES(:CODIGO_PARTICULAR,:TIPO_FAMILIA,DESCFAMILIA,:DescEquipo,:CONTRATO_ACTUAL,
</SPAN>DIASCONTRATO,:TOTAL_DIAS_ARR,:CODIGO_MANTENCION,:DIAS_MANTENCION);
</SPAN>SUSPEND;
END

END
/* END*/
END

END
end

Caral
29-07-2007, 04:33:05
Hola
Sinceramente no le veo el problema, el sistema que usas es muy diferente de lo que hago, pero es entendible.
En este procedimiento haces una serie de pasos, creas una tabla, insertas y borras dependiendo de ciertas circunstancias, para mi usando demasiados if, pero abria que saber lo que haces en si.
En mi humilde opinion el problema podria estar aqui, dependiendo del tamaño de la tabla:

IF( (:Finqui='N')AND(Contador=0) )THEN
BEGIN
SELECT COUNT(*) AS TOTAL
FROM CONTRATOS_DE_ARRIENDO
WHERE CODIGO_CONTRATO =:Contrato
AND Codigo_Maquina =:CODIGO_PARTICULAR
INTO :Contador;
El reto para mi lo que hace es una serie de pasos sin trasendencia, ya que insertar o modificar le llevaria a la base de datos segundos.
Me queda un poco incomodo entender a fondo el proceso que haces, como te digo, es muy diferente a lo que yo hago o haria.
Saludos

BuenaOnda
29-07-2007, 04:49:40
Claro... lo que pasa es que tuve que hacer todo esto en InterBase, por que en delphi, se demora 4 veces mas.... lo que stoy haciendo es mostrar aquellas maquinas que tiene un contrato vigente o fueron arrendadas en alguna ocacion, además capturo las mantenciones y el periodo faltante para las mantenciones, si es que estas maquinas se encuentran arrendadas, e inserto valores en una tabla temporal "Control_tiempo_transcurrido", por que despues, el usuario puede filtrar con los valores resultantes, y en esa ocacion es rapidisimo, puesto que todo filtro se le realiza a la tabla temporal (llenada con este procedimiento), lo otro utilizo un COUNT, por que , de lo contrario, me devolveria un valor NULO, la consulta y eso me retorna un error en el proceso, ya lo intente con la instruccion IS NULL, pero igual falla, pero lo que hace no es tan pesado, para el tiempo que toma... las tablas involucradas no suman mas de 150.000 registros (digo no es pesada por que en access tiene los mismos regitros y se demora 1 segundo, ya que todo esto se traspaso desde access a Interbase).Muchas gracias por tu atencion Caral...:) , espero que me puedas ayudar..

Caral
29-07-2007, 05:13:26
Hola
Me gustaria mucho ayudarte pero como te dije no entiendo muy bien el concepto de lo que quieres hacer.
Yo lo haria diferente, crearia la tabla temporal, pero no en ejecucion, con esto algo de tiempo gano.
Trataria de hacer la sentencia sql que enlazara las tablas en cuestion y posteriormente la cerraria, dependiendo de lo que necesite insertaria en una u otra.
Es muy dificil para mi entender el concepto, espero lo puedas resolver, si esta a mi alcance te ayudare con gusto.
saludos

BuenaOnda
29-07-2007, 05:22:26
muchas gracias...la tabla temporal, esta creada , lo que hace el procedimiento es llenarla solamante...gracias caral por tu ayuda y disposicion. :) ... lei por ahi..que hay una manera de aumentar la memoria de interbase o algo asi..??... si alguien tuviera información al respecto... hasta luego y muchas gracias..