Ver Mensaje Individual
  #1  
Antiguo 23-01-2008
abc_co abc_co is offline
Registrado
 
Registrado: ene 2008
Posts: 1
Reputación: 0
abc_co Va por buen camino
Ayuda con stored procedure que demora demasiado

Hola a todos, el problema es el siguiente:

Tengo un aplicativo de encuestas que funciona sobre plataforma web en el que recojo información para 8 servicios, por estado y ciudad para prestadores de servicios de salud y todo va muy bien, pero ahora necesito hacer un informes anual que sea mes por mes mostrando unos índices de satisfacción para cada prestador en el que se hayan realizado encuestas y como es bastante información entonces he creado unos procedimientos en la BD para hacer consultas y cáulculos y que me devuelva el indicador de un mes para un prestador.

Pero la cuestión es que si tengo por ejemplo encuestas realizadas en 60 prestadores y debo mostrar la ifnormación mes por mes para cada uno de los 8 servicios, eso me da un total de 720 consultas al procedimiento en un solo servicio (60x12meses) y dadas las consultas y cálculos que debo hacer el proceso de generar el reporte se cuelga y no me muestra nada.

He logrado obtener resultados haciendolo localmente, pero la idea es que lo pueda hacer sobre internet, no se si soy claro, entonces si alguién me puede ayudar con esto lo agradecería mucho.

uno de los procedimientos almacenados es el siguiente, para ver si lo puedo optimizar mas:

Código SQL [-]
CREATE PROCEDURE CALC_IND_GLOBAL (
    FI DATE,
    FF DATE,
    DEPTOMUN VARCHAR (5),
    COD_PREST INTEGER)
RETURNS (
    INDICADOR FLOAT)
AS
  /*Variables internas del procedimiento*/
  DECLARE VARIABLE tiempo_espera CHAR(1);
  DECLARE VARIABLE tot_enc INTEGER;
  DECLARE VARIABLE tot_b INTEGER;
  DECLARE VARIABLE ind_p2 FLOAT;
  DECLARE VARIABLE suf CHAR(1);
  DECLARE VARIABLE cla CHAR(1);
  DECLARE VARIABLE opo CHAR(1);
  DECLARE VARIABLE tot_s_s INTEGER;
  DECLARE VARIABLE tot_c_s INTEGER;
  DECLARE VARIABLE tot_o_s INTEGER;
  DECLARE VARIABLE ind_s FLOAT;
  DECLARE VARIABLE ind_c FLOAT;
  DECLARE VARIABLE ind_o FLOAT;
  DECLARE VARIABLE ind_p3 FLOAT;
  DECLARE VARIABLE tot_s INTEGER;
  DECLARE VARIABLE trato CHAR(1);
  DECLARE VARIABLE ind_p4 FLOAT;
  DECLARE VARIABLE ind_serv_amb FLOAT;
  DECLARE VARIABLE tot_sat INTEGER;
  DECLARE VARIABLE niv_sat CHAR(2);
  DECLARE VARIABLE ind_ph FLOAT;
BEGIN
  ind_p2=0;
  tot_enc=0;
  tot_b=0;
  /*Nivel de satisfacción de servicios ambulatorios (P2,P3,P4):*/
  /*Indicador para P2*/
  FOR select TBL_P2_MCI_F_01.TIEMPO_ESPERA from TBL_P2_MCI_F_01, TBL_MCI_F_01 where
  TBL_MCI_F_01.FECHA_ENC<=:FF and TBL_MCI_F_01.FECHA_ENC>=:FI and
  TBL_MCI_F_01.ID_ENC=TBL_P2_MCI_F_01.ID_ENC and TBL_MCI_F_01.DEPTO_MUN=:DEPTOMUN
  and TBL_MCI_F_01.IPS=:COD_PREST INTO :tiempo_espera DO
  BEGIN
    tot_enc=:tot_enc+1;
    if(:tiempo_espera='b') then tot_b=:tot_b+1;
  END
  if(:tot_enc>0) then ind_p2=(:tot_b*100)/:tot_enc;
  else ind_p2=0;
  
  /*Indicador para P3*/
  tot_enc=0; tot_s_s=0; tot_c_s=0; tot_o_s=0;
  FOR select TBL_P3_MCI_F_01.SUFICIENTE,TBL_P3_MCI_F_01.CLARA,TBL_P3_MCI_F_01.OPORTUNA
  from TBL_P3_MCI_F_01, TBL_MCI_F_01 where TBL_MCI_F_01.FECHA_ENC<=:FF
  and TBL_MCI_F_01.FECHA_ENC>=:FI and TBL_MCI_F_01.ID_ENC=TBL_P3_MCI_F_01.ID_ENC
  and TBL_MCI_F_01.DEPTO_MUN=:DEPTOMUN and TBL_MCI_F_01.IPS=:COD_PREST
  INTO :suf, :cla, :opo DO
  BEGIN
 tot_enc=:tot_enc+1;
 if(suf='s') then tot_s_s=:tot_s_s+1;
 if(cla='s') then tot_c_s=:tot_c_s+1;
 if(opo='s') then tot_o_s=:tot_o_s+1;
  END
  if(tot_enc>0) then ind_s=(:tot_s_s*100)/:tot_enc; else ind_s=0;
  if(tot_enc>0) then ind_c=(:tot_c_s*100)/:tot_enc; else ind_c=0;
  if(tot_enc>0) then ind_o=(:tot_o_s*100)/:tot_enc; else ind_o=0;
  ind_p3=(:ind_s+:ind_c+:ind_o)/3;
  
  /*Indicador para P4*/
  tot_enc=0; tot_s=0;
  FOR select TBL_P4_MCI_F_01.TRATO
  from TBL_P4_MCI_F_01, TBL_MCI_F_01 where TBL_MCI_F_01.FECHA_ENC<=:ff
  and TBL_MCI_F_01.FECHA_ENC>=:fi and TBL_MCI_F_01.ID_ENC=TBL_P4_MCI_F_01.ID_ENC
  and TBL_MCI_F_01.DEPTO_MUN=:deptomun and TBL_MCI_F_01.IPS=:cod_prest INTO :trato DO
  BEGIN
    tot_enc=:tot_enc+1;
    if(trato='s') then tot_s=:tot_s+1;
  END
  if(tot_enc>0) then ind_p4=(:tot_s*100)/:tot_enc; else ind_p4=0;
  /*indicador de servicios ambulatorios -> promedio entre los indicadores P2-P3-P4*/
  ind_serv_amb=(:ind_p2+:ind_p3+:ind_p4)/3;
  
  /*Nivel de satisfaccion paciente hospitalizado*/
  tot_enc=0; tot_sat=0;
  FOR select TBL_MCI_F_02.P2 from TBL_MCI_F_02 where
  TBL_MCI_F_02.FECHA_ENC<=:ff and TBL_MCI_F_02.FECHA_ENC>=:fi
  and TBL_MCI_F_02.DEPTO_MUN=:deptomun
  and TBL_MCI_F_02.IPS=:cod_prest into :niv_sat DO
  BEGIN
    tot_enc=:tot_enc+1;
 if(niv_sat='s') then tot_sat=:tot_sat+1;
  END
  if(tot_enc>0) then ind_ph=(:tot_sat*100)/:tot_enc; else ind_ph=0;
  indicador=(:ind_serv_amb+:ind_ph)/2;
  SUSPEND;
END

Última edición por abc_co fecha: 24-01-2008 a las 02:05:25. Razón: Cambio del título del mismo
Responder Con Cita