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 16-07-2007
capo979 capo979 is offline
Miembro
 
Registrado: abr 2007
Posts: 87
Poder: 20
capo979 Va por buen camino
Hola, lo que tengo dentro del SP un for que recorre un select y dentro de este for hago algunos calculos, pero algo debe estar pasando porque 10000 registros es muy poco
Responder Con Cita
  #2  
Antiguo 16-07-2007
capo979 capo979 is offline
Miembro
 
Registrado: abr 2007
Posts: 87
Poder: 20
capo979 Va por buen camino
lo que anda lento parece ser es que tengo dentro del for una consulta asi

select max(id) from tabla where (estab = :estab) and (doc = :doc)
into :maxid;

el problema es con el max me parece

que me pueden decir
Responder Con Cita
  #3  
Antiguo 16-07-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
Yo lo que creo es una combinacion de sentencias la que te hace lenta la consulta, he recreado tu select en una base con 20,000 registros y es de inmediata la respuesta tanto en IBExpert como en Delphi.

Yo insisto en que si no muestras tu SP completo es difícil ayudar, pero noto cierta renuencia de tu parte a hacerlo.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #4  
Antiguo 16-07-2007
capo979 capo979 is offline
Miembro
 
Registrado: abr 2007
Posts: 87
Poder: 20
capo979 Va por buen camino
este es mi SP

CREATE PROCEDURE GEN_ANIMALES (
ESTABLECIMIENTO INTEGER,
ACTUAL DATE,
CON_EVENTO VARCHAR (1) CHARACTER SET NONE)
RETURNS (
ANIMAL INTEGER,
RP VARCHAR (10) CHARACTER SET NONE,
SEXO INTEGER,
RAZA INTEGER,
RAZA_NOMBRE VARCHAR (50) CHARACTER SET NONE,
RODEO INTEGER,
CATEGORIA INTEGER,
CATEGORIA_NOMBRE VARCHAR (50) CHARACTER SET NONE,
CRONO_DENT INTEGER,
ESTADO_REPRO INTEGER,
NACIMIENTO DATE,
EDAD INTEGER,
POTRERO INTEGER,
ACTIVO VARCHAR (1) CHARACTER SET NONE,
COND_CORP INTEGER,
GDR INTEGER,
PESO INTEGER,
RECHAZADO VARCHAR (1) CHARACTER SET NONE,
FRAME FLOAT,
ESTADO_ACTUAL VARCHAR (50) CHARACTER SET NONE,
ULTIMO_EVENTO VARCHAR (255) CHARACTER SET NONE,
EDADCAPTION VARCHAR (12) CHARACTER SET NONE,
ESTADO_LACTACION INTEGER)
AS -- estado_actual, ultimo_evento, datos_eve se deben calcular
declare variable mensaje varchar(50);
declare variable ultimo_eve integer;
declare variable evento varchar(255);

BEGIN
for select ta.id_animal, ta.id_rp, cs.tipo, ta.raza, cr.nombre, ta.rodeo, ta.categoria, cc.nombre,
ta.cronologia_dentaria, ta.estado_reproductivo, ta.fecha_nacimiento, ta.potrero,
ta.activo, ta.condicion_corporal, ta.gdr, ta.peso, ta.rechazado, ta.frame, ta.estado_lactacion
from tab_animales ta, cod_sexos cs, cod_categorias cc, cod_razas cr
where (ta.establecimiento = :establecimiento) and (ta.sexo = cs.id_sexo)
and (ta.raza = cr.id_raza) and (ta.categoria = cc.id_categoria)
into :animal, :rp, :sexo, :raza, :raza_nombre, :rodeo, :categoria, :categoria_nombre, :crono_dent,
:estado_repro, :nacimiento, otrero, :activo, :cond_corp, :GDR, eso, :rechazado, :frame, :ESTADO_LACTACION
do
begin
if (eso is null) then
begin
select first 1 ep.peso from eve_eventos ee, eve_peso ep
where ee.id_evento = ep.id_evento
and ee.animal = :animal
and ee.establecimiento = :establecimiento
order by ee.fecha desc
into eso;
end

edad = (actual - nacimiento)/365;
if (edad < 2) then
EdadCaption = cast(((actual - nacimiento)/30) as varchar(6))||' meses';
else
EdadCaption = cast(edad as varchar(6))||' años';

-- recupero el estado actual desde el sp genereado para calcular el estado actual
select estado_actual from gen_estado_actual(:animal)
into :estado_actual;

--me fijo si tengo que generar_datos del evento
if (con_evento = 'S') then
begin
select max(id_evento) from eve_eventos where (establecimiento = :establecimiento) and (animal = :animal)
into :ultimo_eve;

select nombretipoevento, infoevento from get_datos_eventos_grupal(:ultimo_eve, null, :establecimiento)
into :evento, :ultimo_evento;

ultimo_evento = evento || ', '||ultimo_evento;
end
SUSPEND;
end
END

si yo comento esto

if (eso is null) then
begin
select first 1 ep.peso from eve_eventos ee, eve_peso ep
where ee.id_evento = ep.id_evento
and ee.animal = :animal
and ee.establecimiento = :establecimiento
order by ee.fecha desc
into eso;
end

y esto

select max(id_evento) from eve_eventos where (establecimiento = :establecimiento) and (animal = :animal)
into :ultimo_eve;

anda rápido pero si lo dejo se pone muy lento

tengo todos los indices creados

y utilizo firebird 1.5
Responder Con Cita
  #5  
Antiguo 17-07-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.445
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Una pregunta; ¿Hay alguna razón para no usar JOIN's (INNER sobre todo, -si es posible-) en las consultas y realizar las uniones entre tablas usando los WHERE?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 17-07-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 24
Mick Va por buen camino
Cita:
Empezado por capo979
lo que anda lento parece ser es que tengo dentro del for una consulta asi

select max(id) from tabla where (estab = :estab) and (doc = :doc)
into :maxid;

el problema es con el max me parece

que me pueden decir
Por lo ultimo que explicas a mi parecer todo va rapido solo 10 segundos, estas ejecutando un select por cada registro de la sentencia inicial, eso si el sistema, no escalará bien, cuantos mas registros mas selects a realizar y mucho mas lento.

De todas formas es probable que lo puedas acelerar mas: ¿ seguro que tienes creado un indice "DESCENDENTE" para el campo ID de la tabla ?

Un max(ID) para que sea rapido exige un indice DESCENDENTE sobre el campo ID, no sirve la clave primaria ni un indice normal ascendente (estos solo valen para acelerar la funcion MIN).

Asegurate de usar el ibconsole o cualquier otro programa para probar las queries y mirar el tiempo que tardan y el PLAN que se genera para saber si se esta usando algun indice si pone PLAN (TABLA NATURAL) malo malo, no hay ningun indice que se pueda usar para acelerar la consulta.

Saludos
Responder Con Cita
  #7  
Antiguo 17-07-2007
capo979 capo979 is offline
Miembro
 
Registrado: abr 2007
Posts: 87
Poder: 20
capo979 Va por buen camino
Hago una consulta es posible que en un dbgrid en delphi que tiene asociado un IBQuery no espere a mostrar los datos hasta que termine de cargar los registros.
Por ejemplo tenemos una consulta que la ejecutamos con un IBQuery y esa consulta nos devuelve 30000 registros y el dbgrid no espere a que termine de leer la consulta y que te muestre los que están en pantalla directamente. Si luego navegamos por el dbgrid y bajamos con el scroll ahi si que se actualice. Yo utilizo el EMS como Manager de mi base en firebird y EMS hace esto que digo yo luego que ejecuta una consulta.
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
Muy lento Sql IVAND SQL 8 27-01-2010 03:59:52
Prepare lento en Firebird.. y en MySQL?? xander MySQL 11 01-11-2006 03:02:36
ADO lento CHiCoLiTa Conexión con bases de datos 6 28-07-2004 17:59:46
MDI lento tomasgarcia OOP 1 27-07-2004 20:28:05
lento carlomagno Firebird e Interbase 4 02-07-2004 13:48:08


La franja horaria es GMT +2. Ahora son las 08:24:51.


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