optimizar una consulta

11/03/2009 - 13:16 por Angel | Informe spam
Hola a todos. Tengo una bbdd montada en sql 2000 con ultimo sp y fix.
Estoy corriendo una serie de consultas que me gustaria saber si se pueden
optimizar. Son las siguientes:


Buscamos el usuario del que sabemos su id, email o telefono

select * from usuarios where ((".strlen($id).">0 and
usuarios.id='".sql_quote($id)."') or (".strlen($email).">0 and
usuarios.email='".sql_quote($email)."') or (".strlen($telf).">0 and
(usuarios.telefono1='".sql_quote($telf)."' or
usuarios.telefono2='".sql_quote($telf)."')))


Si existe, mantenemos los datos en $row_user y buscamos todos los usuarios
que tienen algún dato de contacto en común con él

select * from usuarios where 1=2 or (".strlen($row_user["email"]).">0 and
usuarios.email='".sql_quote($row_user["email"])."') or
(".strlen($row_user["telefono1"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono1"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono1"])."')) or
(".strlen($row_user["telefono2"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono2"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono2"])."'))


Guardamos todos los usuarios resultantes en una variable y buscamos todos
los proyectos cuyo campo usuario_id está contenido en esa variable

select distinct proyectos.id as proyectos_id, proyectos.titulo as titulo,
proyectos.cuerpo as cuerpo, proyectos.tipo, proyectos.fecha, usuarios.id as
usuario_id from proyectos, usuarios where proyectos.usuario_id=usuarios.id
and usuarios.id in ".$array_users." order by fecha,titulo


Las consultas funcionan bien y bastante rapidas con pocos registros pero me
gustaria contemplar la posibilidad de optimizarlas para un futuro
crecimiento de dichas tablas.
Gracias por vuestra ayuda.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
11/03/2009 - 13:48 | Informe spam
Angel,

Creo que deberias expandir un poco mas tu pregunta, pues no nos has dado
suficiente informacion como para darte alguna sugerencia.

1 - La sentencia que incluyes no es una sentencia de T-SQL.
2 - No nos das informacion sobre la estructura de las tablas involucradas en
la sentencia, incluyendo restricciones e indices.

Aqui puedes encontrar un par de herramientas que te pueden ayudar a hacer
pruebas de estres sobre tu base de datos en SQL Server 2000.

Description of the SQL Server Performance Analysis Utilities Read80Trace and
OSTRESS
http://support.microsoft.com/kb/887057


AMB


"Angel" wrote:

Hola a todos. Tengo una bbdd montada en sql 2000 con ultimo sp y fix.
Estoy corriendo una serie de consultas que me gustaria saber si se pueden
optimizar. Son las siguientes:


Buscamos el usuario del que sabemos su id, email o telefono

select * from usuarios where ((".strlen($id).">0 and
usuarios.id='".sql_quote($id)."') or (".strlen($email).">0 and
usuarios.email='".sql_quote($email)."') or (".strlen($telf).">0 and
(usuarios.telefono1='".sql_quote($telf)."' or
usuarios.telefono2='".sql_quote($telf)."')))


Si existe, mantenemos los datos en $row_user y buscamos todos los usuarios
que tienen algn dato de contacto en comn con l

select * from usuarios where 1=2 or (".strlen($row_user["email"]).">0 and
usuarios.email='".sql_quote($row_user["email"])."') or
(".strlen($row_user["telefono1"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono1"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono1"])."')) or
(".strlen($row_user["telefono2"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono2"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono2"])."'))


Guardamos todos los usuarios resultantes en una variable y buscamos todos
los proyectos cuyo campo usuario_id est contenido en esa variable

select distinct proyectos.id as proyectos_id, proyectos.titulo as titulo,
proyectos.cuerpo as cuerpo, proyectos.tipo, proyectos.fecha, usuarios.id as
usuario_id from proyectos, usuarios where proyectos.usuario_id=usuarios.id
and usuarios.id in ".$array_users." order by fecha,titulo


Las consultas funcionan bien y bastante rapidas con pocos registros pero me
gustaria contemplar la posibilidad de optimizarlas para un futuro
crecimiento de dichas tablas.
Gracias por vuestra ayuda.

Respuesta Responder a este mensaje
#2 Rubén Garrigós
11/03/2009 - 13:49 | Informe spam
Te recomiendo que no generes ese tipo de consultas con OR y generes una
consulta con los criterios apropiados (es decir, con los datos que tienes)
con un AND. De esa forma tendrás un SARG que podrá sacar partido de los
índices en caso de tenerlos. También te recomendaría que evitaras el uso del
"IN" dinámico en la consulta de búsqueda de proyectos y solucionalo
simplemente con un JOIN entre las tablas.

Si al final la lógica la complicas mucho igual tendrías que buscar otras
alternativas al proceso que estás haciendo. Al tratar sobre una tabla de
usuarios imagino que será bastante pequeña con lo cual salvo que gestiones
millones de usuarios pues imagino que no tendrás demasiados problemas de
rendimiento en todo caso.

Rubén Garrigós
Solid Quality Mentors

"Angel" wrote in message
news:
Hola a todos. Tengo una bbdd montada en sql 2000 con ultimo sp y fix.
Estoy corriendo una serie de consultas que me gustaria saber si se pueden
optimizar. Son las siguientes:


Buscamos el usuario del que sabemos su id, email o telefono

select * from usuarios where ((".strlen($id).">0 and
usuarios.id='".sql_quote($id)."') or (".strlen($email).">0 and
usuarios.email='".sql_quote($email)."') or (".strlen($telf).">0 and
(usuarios.telefono1='".sql_quote($telf)."' or
usuarios.telefono2='".sql_quote($telf)."')))


Si existe, mantenemos los datos en $row_user y buscamos todos los usuarios
que tienen algún dato de contacto en común con él

select * from usuarios where 1=2 or (".strlen($row_user["email"]).">0 and
usuarios.email='".sql_quote($row_user["email"])."') or
(".strlen($row_user["telefono1"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono1"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono1"])."')) or
(".strlen($row_user["telefono2"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono2"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono2"])."'))


Guardamos todos los usuarios resultantes en una variable y buscamos todos
los proyectos cuyo campo usuario_id está contenido en esa variable

select distinct proyectos.id as proyectos_id, proyectos.titulo as titulo,
proyectos.cuerpo as cuerpo, proyectos.tipo, proyectos.fecha, usuarios.id
as usuario_id from proyectos, usuarios where
proyectos.usuario_id=usuarios.id and usuarios.id in ".$array_users." order
by fecha,titulo


Las consultas funcionan bien y bastante rapidas con pocos registros pero
me gustaria contemplar la posibilidad de optimizarlas para un futuro
crecimiento de dichas tablas.
Gracias por vuestra ayuda.

Respuesta Responder a este mensaje
#3 Angel
11/03/2009 - 17:41 | Informe spam
Gracias por las respuestas.
Lo que comenta Rubén es lo que necesitaba para orientarme un poco.

"Angel" escribió en el mensaje de noticias
news:
Hola a todos. Tengo una bbdd montada en sql 2000 con ultimo sp y fix.
Estoy corriendo una serie de consultas que me gustaria saber si se pueden
optimizar. Son las siguientes:


Buscamos el usuario del que sabemos su id, email o telefono

select * from usuarios where ((".strlen($id).">0 and
usuarios.id='".sql_quote($id)."') or (".strlen($email).">0 and
usuarios.email='".sql_quote($email)."') or (".strlen($telf).">0 and
(usuarios.telefono1='".sql_quote($telf)."' or
usuarios.telefono2='".sql_quote($telf)."')))


Si existe, mantenemos los datos en $row_user y buscamos todos los usuarios
que tienen algún dato de contacto en común con él

select * from usuarios where 1=2 or (".strlen($row_user["email"]).">0 and
usuarios.email='".sql_quote($row_user["email"])."') or
(".strlen($row_user["telefono1"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono1"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono1"])."')) or
(".strlen($row_user["telefono2"]).">0 and
(usuarios.telefono1='".sql_quote($row_user["telefono2"])."' or
usuarios.telefono2='".sql_quote($row_user["telefono2"])."'))


Guardamos todos los usuarios resultantes en una variable y buscamos todos
los proyectos cuyo campo usuario_id está contenido en esa variable

select distinct proyectos.id as proyectos_id, proyectos.titulo as titulo,
proyectos.cuerpo as cuerpo, proyectos.tipo, proyectos.fecha, usuarios.id
as usuario_id from proyectos, usuarios where
proyectos.usuario_id=usuarios.id and usuarios.id in ".$array_users." order
by fecha,titulo


Las consultas funcionan bien y bastante rapidas con pocos registros pero
me gustaria contemplar la posibilidad de optimizarlas para un futuro
crecimiento de dichas tablas.
Gracias por vuestra ayuda.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida