Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] optimizacion de consultas

Estas en el tema de optimizacion de consultas en el foro de PHP en Foros del Web. hola buenas tardes... les consulto, lo siguiente, tengo una hoja con un refresh cada 1 minuto...y realiza las siguientes consultas... Código PHP: $query  =  "SELECT COUNT(eventid) FROM events WHERE eventtypendx = '14' AND DATEDIFF(day, eventtime, getdate()) < 1 AND devicename LIKE '%inq%'" ...
  #1 (permalink)  
Antiguo 17/02/2013, 13:53
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
optimizacion de consultas

hola buenas tardes...
les consulto, lo siguiente, tengo una hoja con un refresh cada 1 minuto...y realiza las siguientes consultas...

Código PHP:
$query "SELECT COUNT(eventid) FROM events WHERE eventtypendx = '14' AND DATEDIFF(day, eventtime, getdate()) < 1 AND devicename LIKE '%inq%'"
$result mssql_query($query);
$count mssql_fetch_array($result);

$query "SELECT COUNT(eventid) FROM events WHERE eventtypendx = '14' AND DATEDIFF(day, eventtime, getdate()) < 1 AND devicename LIKE '%SAL%'"
$result mssql_query($query);
$count1 mssql_fetch_array($result);

$inq $count[0] - $count1[0];


$query "SELECT COUNT(eventid) FROM events WHERE eventtypendx = '14' AND DATEDIFF(day, eventtime, getdate()) < 1 AND devicename LIKE '%PB1%'"
$result mssql_query($query);
$count mssql_fetch_array($result);

$query "SELECT COUNT(eventid) FROM events WHERE eventtypendx = '14' AND DATEDIFF(day, eventtime, getdate()) < 1 AND devicename LIKE '%SS1%'"
$result mssql_query($query);
$count1 mssql_fetch_array($result);

$garage $count[0] - $count1[0]; 
Como resultado obtengo 2 numeros (el 1ero marca la cantidad de gente en el edificio y el segundo la cantidad de autos en garage).

Se podría de alguna manera hacer q esta consulta se ejecute de forma mas rapida? Hoy tarda unos 15..20 seg. en mostrar los resultados

gracias a todos!
__________________
Bye!
  #2 (permalink)  
Antiguo 17/02/2013, 13:56
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: optimizacion de consultas

Qué índices tienes creados en esa tabla?
  #3 (permalink)  
Antiguo 17/02/2013, 15:09
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: optimizacion de consultas

la columna eventid es mi primary key
__________________
Bye!
  #4 (permalink)  
Antiguo 17/02/2013, 15:16
 
Fecha de Ingreso: febrero-2013
Mensajes: 65
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: optimizacion de consultas

Agregale 3 índices más:
eventtime
eventtypendx
devicename
  #5 (permalink)  
Antiguo 17/02/2013, 15:16
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: optimizacion de consultas

Lo que necesitas son índices..Aunque el LIKE ese, sobre todo con '%' en los dos lados, no te va a ayudar mucho...Mete al menos un indice con eventtypendx , y, aunque lo tendría que mirar, un indice con eventtypendx ,eventtime y devicename...aunque es una ranged query...Habría que verlo.
  #6 (permalink)  
Antiguo 17/02/2013, 15:20
 
Fecha de Ingreso: febrero-2013
Mensajes: 65
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: optimizacion de consultas

Además estás yendo al servidor a buscar los datos 2 veces en vez de una, podrías rearmar la consulta a ir únicamente 1 vez. Digamos, buscar el count1 y el count2 en una sola consulta de SQL.
  #7 (permalink)  
Antiguo 17/02/2013, 16:38
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: optimizacion de consultas

si tomibolo como puedo hacer eso?
para ir una sola ves?
como planteo el select?
__________________
Bye!
  #8 (permalink)  
Antiguo 17/02/2013, 16:47
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: optimizacion de consultas

Pelao..has metido ya los indices...? Eso es lo que te va a dar velocidad..Las 4 queries se pueden hacer a la vez..pero a menos que metas los indices, el resto da igual.
  #9 (permalink)  
Antiguo 17/02/2013, 17:08
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: optimizacion de consultas

como debería hacerlo?
asi, especificando mas valores en el select?

Código PHP:
$query "SELECT COUNT(eventid), eventtime, eventtypendx, devicename FROM events WHERE eventtypendx = '14' AND DATEDIFF(day, eventtime, getdate()) < 1 AND devicename LIKE '%inq%'"
$result mssql_query($query);
$count mssql_fetch_array($result); 

mi estructura de tabla es:

CREATE TABLE [dbo].[Events](
[EventId] [int] NOT NULL,
[EventTime] [datetime] NOT NULL,
[TenantNdx] [tinyint] NULL CONSTRAINT [DF_Events_TenantId] DEFAULT (0),
[IndivNdx] [smallint] NULL CONSTRAINT [DF_Events_UserId] DEFAULT (0),
[AccessVerNdx] [smallint] NULL CONSTRAINT [DF_Events_AccessVer] DEFAULT (0),
[HostNum] [smallint] NULL,
[PointAddr] [int] NULL CONSTRAINT [DF_Events_PointAddr] DEFAULT (0),
[SiteNum] [tinyint] NULL,
[EventTypeNdx] [tinyint] NULL,
[StatusByte] [tinyint] NULL,
[Priority] [tinyint] NULL,
[DistGroup] [tinyint] NULL,
[CellNdx] [smallint] NULL,
[DistMask] [tinyint] NULL,
[FloatValue] [float] NULL,
[TextField] [char](4) COLLATE Modern_Spanish_CI_AS NULL,
[ControlDescr] [char](4) COLLATE Modern_Spanish_CI_AS NULL,
[ControlSource] [char](4) COLLATE Modern_Spanish_CI_AS NULL,
[DeviceName] [varchar](16) COLLATE Modern_Spanish_CI_AS NULL,
[MessageText] [varchar](64) COLLATE Modern_Spanish_CI_AS NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Events] WITH CHECK ADD CONSTRAINT [FK_Events_EventTypes] FOREIGN KEY([EventTypeNdx])
REFERENCES [dbo].[EventTypes] ([EventTypeId])
GO
ALTER TABLE [dbo].[Events] CHECK CONSTRAINT [FK_Events_EventTypes]
GO
ALTER TABLE [dbo].[Events] WITH CHECK ADD CONSTRAINT [FK_Events_UserHistory] FOREIGN KEY([TenantNdx], [IndivNdx], [AccessVerNdx])
REFERENCES [dbo].[UserHistory] ([TenantNdx], [IndivNdx], [AccessVerId])
GO
ALTER TABLE [dbo].[Events] CHECK CONSTRAINT [FK_Events_UserHistory]

gracias nuevamente!
__________________
Bye!
  #10 (permalink)  
Antiguo 17/02/2013, 17:20
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: optimizacion de consultas

Código MySQL:
Ver original
  1. alter table events add index i1(eventtypendx);
  2. alter table events add index i2(eventtypendx ,eventtime,devicename);
  #11 (permalink)  
Antiguo 18/02/2013, 16:39
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: optimizacion de consultas

genial!!!
Gracias dashtrash
__________________
Bye!

Etiquetas: resultados, select, sql
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 10:43.