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 Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #6  
Antiguo 23-06-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 23
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
¿Has probado la consulta con los datos que busca el cliente que tarda mucho?

Prueba la misma consulta con algunas variaciones

Asigna ALIAS prefijo a todos los campos para evitar alguna ambigüedad que pueda haber.

Código SQL [-]
select ?.cod_producto, ?.nombre, precioa, ?.preciob, ?.precioc, ?.preciod, ?.porc1, ?.ubicacion, ?.aplica_iva, ?.fraccion, p.saldo_fac,
       ?.operativo, ?.pordes,
       case ?.aplica_iva
         when 'S' then
             ?.precioa + (?.precioa * e.iva / 100)
         else ?.precioa
       end ?.precioivaa,
       case ?.aplica_iva
         when 'S' then
             ?.preciob + (?.preciob * e.iva / 100)
         else ?.preciob
       end ?.precioivab,
       case ?.aplica_iva
         when 'S' then
             ?.precioc + (?.precioc * e.iva / 100)
         else precioc
       end ?.precioivac,
       case ?.aplica_iva
         when 'S' then
             ?.preciod + (?.preciod * e.iva / 100)
         else ?.preciod
       end ?.precioivad,
       ?.cod_barra, p.key_producto, p.peso, p.bloqueo_cambio_precio, p.tipo_accion, z(p.saldo_fraccion) saldo_fraccion,
       (select t.descripcion
        from tabla t
        where
        t.key_hijo = p.cod_marca) marca
from empresa e
join producto p on e.key_empresa = p.key_empresa
where
p.key_empresa = :key_empresa and
upper(?.nombre) like :nombre

Prueba con JOIN, LEFT JOIN, y diferente orden de tablas

Código SQL [-]
select ... 
from empresa e
join producto p on e.key_empresa = p.key_empresa
where
/**/p.key_empresa = :key_empresa and
upper(?.nombre) like :nombre

Código SQL [-]
select ... 
from empresa e
join producto p on e.key_empresa = p.key_empresa
where
/**/e.key_empresa = :key_empresa and
upper(?.nombre) like :nombre

Código SQL [-]
select ... 
from producto p
/**/LEFT join empresa e on e.key_empresa = p.key_empresa
where
p.key_empresa = :key_empresa and
upper(?.nombre) like :nombre

Código SQL [-]
...
       ?.cod_barra, p.key_producto, p.peso, p.bloqueo_cambio_precio, p.tipo_accion, z(p.saldo_fraccion) saldo_fraccion,
       /**/t.descripcion marca/**/
from empresa e
join producto p on e.key_empresa = p.key_empresa
/*JOIN o LEFT JOIN*/
/**/join tabla t on t.key_hijo = p.cod_marca*//*
where
p.key_empresa = :key_empresa and
upper(?.nombre) like :nombre

¿Qué es la función z()?
Puede ser que esté haciendo algo que tarde mucho.
Si es una UDF, pueda que tenga un error dentro y esté tirando abajo el servidor (división por 0, por ejemplo)

¿Qué indices tienen las tablas?
Por lo menos debería haber
  • TABLA.KEY_HIJO
  • EMPRESA.KEY_EMPRESA
  • PRODUCTO.KEY_EMPRESA

¿Has probado recalcular la selectividad de los índices?
Código SQL [-]
/*Recalculo de selectividad de indice PRODUCTO_KEY_IDX de la tabla PRODUCTO*/
SET STATISTICS INDEX PRODUCTO_KEY_IDX

¿Has revisado el PLAN que devuelve la consulta?
Puede que te de una pista de donde pasa el tiempo buscando datos.

¿Cuantos registros tiene cada tabla?
Si utilizas LEFT JOIN podrías unir la que menos registros tiene a la que mas, para evitar recorrer la que más registros tiene.

Una posible solución es a veces transformar el SQL en un procedimiento.
Código SQL [-]
create procedure dame_datos (
    key_empresa integer)
returns (
    ...)
as
declare variable...;
begin
    for select...
        from empresa
        where
        key_empresa = :key_empresa
        into...
        order by...
    do
    begin
        for select cod_marca, ...
            from producto
            where
            key_empresa = :key_empresa
            into :cod_marca, ...
        do
        begin
            select descripcion
            from tabla
            where
            key_hijo = :cod_marca
            into :descripcion;

            -- Calculo de precios
            ---

            suspend;
        end
    end
end

/* y luego */
select * from dame_datos(:key_empresa)

Última edición por duilioisola fecha: 23-06-2022 a las 17:08:13.
Responder Con Cita
 



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
Entender Firebird 3.... Neeruu Varios 4 25-04-2018 13:47:42
TRichEdit, TStringStream y cierto error que no logro "cachar"... TiammatMX OOP 2 12-05-2012 00:36:18
consulta mysql que no logro entender gulder MySQL 2 14-02-2012 14:54:51
Sigo sin entender el error... gandalf_27 C++ Builder 1 11-06-2006 16:35:46
Entender una sentencia Renees Varios 5 02-09-2005 19:35:01


La franja horaria es GMT +2. Ahora son las 09:43:57.


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