FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Velocidad en Interbase
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.. |
#2
|
||||
|
||||
sigo con el problemita, cualquier aporte se les agradecera mucho..
|
#3
|
||||
|
||||
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 |
#4
|
||||
|
||||
Utilizo los componentes IB... para dephi 7... y utilizo Interbase 6.0...
|
#5
|
||||
|
||||
Hola
Si no es el componente, por que IB, es rapido segun dicen, entonces es la cantidad de informacion que trae. Saludos |
#6
|
||||
|
||||
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.. ..
|
#7
|
||||
|
||||
Hola
Lo unico que se me ocurre preguntar es con que enlazas, con una IBtable o IBQuery ? Saludos |
#8
|
||||
|
||||
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 [-] 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,IASPASO DO BEGIN IF(:CONTRATO_ACTUAL > 0)THEN DIAS_MANTENCION=IASPASO - ('NOW' - FEC_VIGENCIA); ELSE DIAS_MANTENCION=IASPASO; 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,ESCFAMILIA,escEquipo,:CONTRATO_ACTUAL, IASCONTRATO,:TOTAL_DIAS_ARR,:CODIGO_MANTENCION,IAS_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,escEquipo,:CONTRATO_ACTUAL, </SPAN>DIASCONTRATO,:TOTAL_DIAS_ARR,:CODIGO_MANTENCION,IAS_MANTENCION); </SPAN>SUSPEND; END END /* END*/ END END end |
#9
|
||||
|
||||
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: 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 |
#10
|
||||
|
||||
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..
|
#11
|
||||
|
||||
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 |
#12
|
||||
|
||||
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..
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Velocidad en interbase | r.g.r | Firebird e Interbase | 3 | 22-05-2007 20:14:25 |
Mejorar la Velocidad de Un Store Procedure(InterBase) | BuenaOnda | Conexión con bases de datos | 2 | 10-08-2006 00:22:15 |
Velocidad Interbase | fjardelphi | Firebird e Interbase | 5 | 01-02-2005 09:45:04 |
Velocidad en Interbase | cesar_picazo | Conexión con bases de datos | 4 | 23-11-2004 00:30:31 |
|