Club Delphi  
    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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-01-2008
abc_co abc_co is offline
Registrado
 
Registrado: ene 2008
Posts: 1
Poder: 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
  #2  
Antiguo 23-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Hola.

Bienvenid@ a los foros del Club Delphi.

Te recomiendo una lectura de la guia de estilo (link en mi firma). Allí comprenderás por que tenes poco chance de obtener respuestas en este hilo.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 25-01-2008
Damian E Cabrer Damian E Cabrer is offline
Registrado
 
Registrado: ene 2008
Posts: 1
Poder: 0
Damian E Cabrer Va por buen camino
Wink Cambia tu estrategia

Hola abc_co creo que deberias cambiar de estrategia , si la informacion que quieres desplegar pueden verla actualizada a un dia anterior , por el hecho de ser mensual , creo que deberias hacer tablas de resumen y actualizarlas con un proceso nocturno , para que durante el dia las consultas sean mucho mas rapidas.
Responder Con Cita
  #4  
Antiguo 09-02-2008
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
Prueba con añadir 1 indice a la Tabla en aquellos campos que más uses dentro del Where de los Select's.

Suerte....
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King
Responder Con Cita
Respuesta



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
Ayuda con Stored Procedure Firebird Blackspike Firebird e Interbase 4 07-01-2008 18:18:39
Ayuda con Stored Procedure Fita Firebird e Interbase 2 28-11-2007 01:28:03
Ayuda con Stored Procedure gluglu Conexión con bases de datos 6 26-09-2007 14:20:53
Ayuda con Stored Procedure Sudamericano Firebird e Interbase 13 09-06-2004 01:26:32
Ayuda con Stored Procedure tgsistemas SQL 2 30-03-2004 23:30:40


La franja horaria es GMT +2. Ahora son las 01:49:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi