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

Consulta por count(*)

Estas en el tema de Consulta por count(*) en el foro de Bases de Datos General en Foros del Web. estimados tengo este select SELECT proto,count(*) FROM FortinetIMFilter where host='200.113.161.91' and substr(date_time,1,10)>='2009-10-21' and substr(date_time,1,10)<='2009-11-20' group by proto order by count(*) desc si se dan cuenta ...
  #1 (permalink)  
Antiguo 30/11/2009, 08:41
Avatar de FNX_NET  
Fecha de Ingreso: marzo-2004
Ubicación: EN EL INFIERNO.....
Mensajes: 1.707
Antigüedad: 20 años, 1 mes
Puntos: 7
Consulta por count(*)

estimados tengo este select


SELECT proto,count(*) FROM FortinetIMFilter where host='200.113.161.91' and substr(date_time,1,10)>='2009-10-21' and substr(date_time,1,10)<='2009-11-20' group by proto order by count(*) desc

si se dan cuenta tiene un count(*), ahora mi pregunta es que se demora mucho, pero tengo la inquietud de que cuando hago * llamo a toda la tabla y hago un uso excesivo de memoria o no :O?
__________________
:-D "Que se libere del cielo confinado; que mi cuerpo sea la espada de hielo negro que nos lleve al abismo; que ningún poder pueda detenernos...Destructora de las almas de los dioses!!!":adios:


:pirata:
  #2 (permalink)  
Antiguo 30/11/2009, 09:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta por count(*)

Te pongo la sintaxis MySQL, porque no sé si se trata de esa base de datos.
SELECT proto, count(*)TOTAL FROM FortinetIMFilter where host='200.113.161.91' and (DATE(date_time) >='2009-10-21' and DATE(date_time)<='2009-11-20') group by proto order by count(*) desc

imagino que tu campo date_time es tipo datetime, si fuera date no sería necesaria la funcion date. Piensa que lo que tú has hecho es un casting a cadena de texto y comparación. Otra posible mejora sería tener indexado el campo host. Prueba a ver si mejora algo y dinos...
  #3 (permalink)  
Antiguo 30/11/2009, 09:15
Avatar de FNX_NET  
Fecha de Ingreso: marzo-2004
Ubicación: EN EL INFIERNO.....
Mensajes: 1.707
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: Consulta por count(*)

estimado podrias darme un ejemplo por el problema del casting y por lo otro ahora mismo creo una indexacion del campo
__________________
:-D "Que se libere del cielo confinado; que mi cuerpo sea la espada de hielo negro que nos lleve al abismo; que ningún poder pueda detenernos...Destructora de las almas de los dioses!!!":adios:


:pirata:
  #4 (permalink)  
Antiguo 30/11/2009, 10:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta por count(*)

esto, substr(date_time,1,10)>='2009-10-21' and substr(date_time,1,10)<='2009-11-20', convierte la fecha en una cadena de texto y lo que hace es compararlas como cadena de texto con las fechas como si se tratase de una cadena de texto, y no como número que es lo que hay detrás de una fecha. Imagina la diferencia entre buscar lo que está entre Juan Martínez Rodríguez y Zamudio Sánchez, en la que la base debe comparar letra por letra y la posición que ocupa en el abecedario, y comparar entre 1 y 1000, donde compara números, algo mucho más rápido, porque entre otras razones su almacenamiento en binario es más corto,y su comparación más rápida. Eso es lo que creo que ocurre si aplicas substr a la fecha, una función de cadena de texto, y no de fecha, como es DATE, por citarte sólo una. DATE extrae el número correspondiente a la fecha sin el time en un datetime, mientras que substr la convierte en una cadena de texto..., vamos, como si la hubieras guardado en un campo varchar, y hace el cambio de fecha a texto. Creo que es eso, aunque seguro no estoy.
  #5 (permalink)  
Antiguo 30/11/2009, 11:01
Avatar de FNX_NET  
Fecha de Ingreso: marzo-2004
Ubicación: EN EL INFIERNO.....
Mensajes: 1.707
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: Consulta por count(*)

ENTONCES EN VEZ DE HACER EL SUBSTR lo dejo como date, porque el campo de la tabla es date_time, pero en el count(*) lo dejo tal cual :O?
__________________
:-D "Que se libere del cielo confinado; que mi cuerpo sea la espada de hielo negro que nos lleve al abismo; que ningún poder pueda detenernos...Destructora de las almas de los dioses!!!":adios:


:pirata:
  #6 (permalink)  
Antiguo 30/11/2009, 12:00
Avatar de DanX03  
Fecha de Ingreso: septiembre-2007
Ubicación: México D.F.
Mensajes: 148
Antigüedad: 16 años, 7 meses
Puntos: 3
Respuesta: Consulta por count(*)

Yo utilizaria la singuiente sintaxis:

SELECT proto, count(1)TOTAL FROM FortinetIMFilter where host='200.113.161.91' and DATE between convert(datetime,'21/10/2009',103) and convert(datetime,'20/11/2009',103)+1 group by proto order by TOTAL desc

asi es como realizas un conteo mas rapido entre las fechas dadas.
  #7 (permalink)  
Antiguo 30/11/2009, 15:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta por count(*)

Perdona, pero no entendí que se trataba de una IP. Olvídate del índice de ese campo y usa la función inet_aton()

SELECT proto, count(*)TOTAL FROM FortinetIMFilter where INET_ATON(host)=INET_ATON('200.113.161.91') and (DATE(date_time) >='2009-10-21' and DATE(date_time)<='2009-11-20') group by proto order by count(*) desc

una cosa, más, no creo que un índice en el campo date_time sea de gran ayuda en este caso. Prueba quizás cambiando el orden en el WHEN, y compara.
SELECT proto, count(*)TOTAL FROM FortinetIMFilter where (DATE(date_time) >='2009-10-21' and DATE(date_time)<='2009-11-20') and INET_ATON(host)=INET_ATON('200.113.161.91') group by proto order by count(*) desc


A ver si eso ayuda algo.

Última edición por jurena; 30/11/2009 a las 16:22
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




La zona horaria es GMT -6. Ahora son las 02:07.