Ver Mensaje Individual
  #16  
Antiguo 23-06-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.737
Reputación: 20
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