Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Eficiencia en consulta!

Estas en el tema de Eficiencia en consulta! en el foro de Mysql en Foros del Web. Saludos! Es la primer vez que escribo en ésta sección . . . . . . Y el motivo es el siguiente: Tengo 2 tablas ...
  #1 (permalink)  
Antiguo 23/02/2009, 18:51
 
Fecha de Ingreso: agosto-2008
Mensajes: 82
Antigüedad: 15 años, 7 meses
Puntos: 4
Exclamación Eficiencia en consulta!

Saludos!

Es la primer vez que escribo en ésta sección . . .
. . . Y el motivo es el siguiente:

Tengo 2 tablas tblDatos, tblTipoDato . . .
Para ésto manejo 5 status diferentes y 17 tipos de datos . . .

Lo que necesito es Desplegar cuantos Datos tengo de cada tipo, dependiendo de cada status . . .

ID | Tipo Dato | Status1 | Status2 | Status3 | Status4 | Status5

Para ésto . . . (lo más rápido que se me ocurrió) hago un count en subconsultas . . .

Ejemplo:

Código:
SELECT IDTipo,NombreTipo, 
(Select count(ID) From tblDatos Where TipoDato=IDTipoDato And Status = 'Status1') AS Status01, 
(Select count(ID) From tblDatos Where TipoDato=IDTipoDato And Status = 'Status2') AS Status02 . . . . ETC . . . 
FROM tblTipoDato
La consulta funciona perfectamente . . . pero se tarda varios segundos al ser ejecutada . . .

Hay alguna forma de implementar ésta consulta para que se tarde mucho menos tiempo ? ? ?

Gracias Por sus respuestas ! ! !
  #2 (permalink)  
Antiguo 24/02/2009, 00:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Eficiencia en consulta!

No sé si es esto lo que quieres, los status de cada tipo de dato con su total. No puedes poner el id en un group by en el que si hay dos o tres de un determinado status, pues te pondría el primer id, pero el dato sería engañoso: un id para referirte al total de varios id (por eso lo he quitado).

Código sql:
Ver original
  1. SELECT IDtipo, NombreTipo, STATUS, COUNT(*) TOTAL FROM tblTipoDato INNER JOIN tblDatos ON tblDatos.TipoDato=tblTipoDato.IDtipoDato GROUP BY IDtipoDato, STATUS

tampoco sabía con seguridad si el campo IDtipoDato es de la tabla tblTipoDato, pero lo he puesto así
  #3 (permalink)  
Antiguo 24/02/2009, 05:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Eficiencia en consulta!

Lo que estás tratando de ubicar es la cantidad de ocurrencias de cada estado, y como el campo es siempre el mismo, creas una subconsulta por cada uno.
La idea esta cerca, pero no es eficiente. Cada una de esas consultas barre toda la tabla; po reso es lenta: Al haber cinco estados hay cinco barridos de tabla. Y como no hay índices en ese campo la cosa se toma todo el tiempo posible...
Existen dos formas simples de encarar el asunto:
1. La que te está proponiendo jurena, con el INNER JOIN.
2. Sumar las ocurrencias en una sola barrida.
Esta segunda sería:
Código sql:
Ver original
  1. SELECT
  2.     IDTipo,
  3.     NombreTipo,
  4.     SUM(IF(STATUS = 'Status1',1,0)) Status01,
  5.     SUM(IF(STATUS = 'Status2',1,0)) Status02,
  6.     SUM(IF(STATUS = 'Status3',1,0)) Status03,
  7.     SUM(IF(STATUS = 'Status4',1,0)) Status04,
  8.     SUM(IF(STATUS = 'Status5',1,0)) Status05
  9. FROM tblTipoDato
  10. WHERE
  11.     TipoDato=IDTipoDato;
En definitiva, lo que hará por cada registro es sumar 1 ó 0 según sea el valor del campo, en cada caso.
Pruébalo y nos cuentas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 24/02/2009, 09:53
 
Fecha de Ingreso: agosto-2008
Mensajes: 82
Antigüedad: 15 años, 7 meses
Puntos: 4
De acuerdo Respuesta: Eficiencia en consulta!

SALUDOS ! ! !

Antes que otra cosa . . . GRACIAS a los 2 por su aporte . . . . . . los 2 fueron buenos . . . pero decidí quedarme con el de gnzsoloyo ya que no me genera tantas rows como el primero (64 rows) . . .

El query quedó de la siguiente manera:

Código sql:
Ver original
  1. SELECT
  2.      IDTipoDato, NombreTipo,
  3.      SUM(IF(STATUS = 'Status01',1,0)) STATUS01,
  4.      SUM(IF(STATUS = 'Status02' AND cond01 = '0',1,0)) STATUS02 ,
  5.      SUM(IF(STATUS = 'Status02' AND cond01 != '0',1,0)) STATUS03,
  6.      SUM(IF(STATUS = 'Status03',1,0)) STATUS04,
  7.      SUM(IF(STATUS = 'Status04',1,0)) STATUS05,
  8.      SUM(IF(STATUS = 'Status05',1,0)) STATUS06
  9. FROM tblTiposDato
  10. INNER JOIN tblDatos
  11. ON
  12.   TipoDato = IDTipoDato
  13. GROUP BY IDTipoDato

Los resultados son realmente notorios . . .

ANTES: 16 rows fetched in 0.0139s (0.6709s)
AHORA: 15 rows fetched in 0.0111s (0.0311s)

Muchas gracias . . .

Y nos seguimos viendo por aquí . . .

Bye bye ! ! !

[ C O N C L U I D O ]
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 17:37.