Cita:
Empezado por Choclito
Muchas gracias a todos los amigos del foro con sus criterios, tengo varias consultas:
1ro.- Pedirles porfavor la direccion de donde pueda bajar el programa ib plananalyzer pues busce en la web y no encontre ningun sitio.
2do.- Me baje un programa Interbase&Firebird Development Studio con el cual como uno de los amigos del foro me dijo probar los select del primer SP por separado para ver los resultados y probe el siguiente select:
Código SQL [-]select r.nro_recibo,cast(r.fecha as date),g.nombre, case r.porcentaje_cobro when 100 then r1.costo else (r.porcentaje_cobro*r1.costo)/100 end,r.costo_total,r.literal,r.nro_ambulatorio,r.usuario,r.tipo_paciente,r.nro_asegurado,r.nro_intern acion,r.factura,cast(r.fecha as time),r.monto_cobrar,r.porcentaje_cobro,r1.nro,r.nro_factura from recibo r,registro__ecografia R1,ecografia g where ((r1.nro_recibo=r.nro_recibo)and(r1.tipo_ecografia=g.nro)and(cast(r.fecha as date) between :f1 and :f2)and(r.cancelado=:valor)and((r.cancelado=:valor)or(r.cancelado='M')))
y me muestra lo siguiente:
PLAN JOIN (R1 NATURAL, G INDEX (PK_ECOGRAFIA), R INDEX (PK_RECIBO))
aparte en el selec trabajo con las tablas recibo, recibo_ecografia y ecografia
y me muestra una grafica en barras donde me muestra que la tabla registro_ecografia no esta indexada, ademas me muestra que el tiempo que tarda es de 15 ms
Tengo indices creados tanto por las llaves primarias y foraneas de las tablas
Espero me puedan ayudar porfavor o darme sugerencias de como solucionar este problema mil gracias
|
Hola.
Mi primera recomendación es que hagas explícitas las uniones, queda todo mucho más claro, fácil de entender y modificar, y mucho más fácil de optimizar, tanto para el motor SQL como para que tu veas los índices necesarios.
Esa misma consulta queda en :
Código SQL
[-]select recibo.nro_recibo,cast(recibo.fecha as date) as fecha, cast(recibo.fecha as time) as hora,
ecografia.nombre as ecografia,
case recibo.porcentaje_cobro when 100 then registro__ecografia.costo
else (recibo.porcentaje_cobro * registro__ecografia.costo) / 100 end as costo,
recibo.costo_total, recibo.literal, recibo.nro_ambulatorio, recibo.usuario, recibo.tipo_paciente, recibo.nro_asegurado,
recibo.nro_internacion, recibo.factura, recibo.monto_cobrar, recibo.porcentaje_cobro, recibo.nro_factura,
registro__ecografia.nro
from recibo
inner join registro__ecografia on registro__ecografia.nro_recibo = recibo.nro_recibo
inner join ecografia on ecografia.nro = registro__ecografiaa.tipo_ecografia
where cast(recibo.fecha as date) between :desde and :hasta and
recibo.cancelado = :valor
Es fácil entender que la tabla
registro__ecografia necesita un índice para el campo
nro_recibo, la tabla
ecografia necesita un índice en el campo
nro, y la tabla
recibo necesita un índice múltiple sobre los campos
cancelado, fecha (en ese orden).
NOTA : Fíjate que he acortado la condición :
and(r.cancelado=:valor)and((r.cancelado=:valor)or(r.cancelado='M'))
dejándola en :
and recibo.cancelado = :valor
Puesto que :
A ^ (A v B) es igual a
A
Saludos.