¿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 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
[-]
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
select * from dame_datos(:key_empresa)