entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Una mega consulta sql o varias consultas sencillas

HOla.

Veo que se sugiere no pedir recomendaciones asique mi pregunta se orienta a lo que objetivamente es más efectivo y evita sobrecargar el servidor:
En un sistema institucional que gestiona:

  • Alumnos,
  • Docentes,
  • Cursos,
  • Reserva de espacios.
    Hice una pantalla de bienvenida donde muestro todas las novedades del día, para lo cual busco en distintas tablas los registros que tengan la fecha actual y los muestro todos juntos en una lista.
    como la siguiente:
  • Hoy falta tal docente.
  • Hoy cumpleaños tal alumno,
  • Se ha reservado tal espacio, etc...

¿Cómo trabajará mejor el servidor?
1- Con una sola consulta gigante sobre todas las tablas unificadas por la fecha actual?
2- Con varias consultas específicas de cada tabla.

Desde ya muchas gracias.

1voto

Jesusmaster comentado

estimado,
todo depende de la calidad de las query's tienes algun ejemplo de tus query's?

0voto

top21tk comentado

 // NOVEDADES DEL DÍA

 $result1=mysql_query("SELECT * from diario where (diario.titulo not like '#mesa') and diario.fecha = '$dia' order by diario.fecha, diario.titulo, diario.id", $link) or die ("Error en consulta");

// probé el atributo title en un li y parece que funciona

 while($row1 = mysql_fetch_array($result1)){
 echo "<li title='Lo escribió ".$row1["firma"]."'>".$row1["titulo"].": ".$row1["detalle"];
   }

 // CUMPLEAÑOS
 $cumple=date("m-d");
 $result2=mysql_query("SELECT * from personal where NACIO like '%$cumple%' and INACTIVI=0 order by nombrecompleto", $link) or die ("Error en consulta2"); 
  while($row2 = mysql_fetch_array($result2)){
 echo "<li>Cumple: ".$row2["NOMBRECOMPLETO"]."(".$row2["NACIO"].")";
   }

0voto

bl4z3r comentado

¿Seria posible ver la estructura de las tablas a las cuales haces consultas?

0voto

top21tk comentado

Hola @bl4z3r

Por unos días podrás ver la estructura en este link
Saludos

0voto

bl4z3r comentado

@top21tk ¿Hay alguna posibilidad de corregir los errores como estructura de tablas?

PD: me has dado una imagen con la estructura de las tablas pero no se le tipo de las columnas y ni las relaciones entre las tablas como para poder cargar datos dummy y podes hacer algo.

0voto

top21tk comentado

HOla.
Esa toma de pantalla es de adminer.
Los colores están relacionados con el tipo de datos que almacena.
Saludos.

2 Respuestas

0voto

Jesusmaster Puntos1610

Bueno amigo, por lo que veo te conviene mucho mas trabajar con consultas separadas ya que son independientes unas de otras. ahora mi consejo sería que utilizaras Programacion Orientada a Objeto. ya que por lo que veo no tienes un objeto que maneje las consultas. también tienes que manejar los terminos de consulta o los cierre de conexión que generalmente son los que dan problemas en el estilo de programación estructurada.

espero poder ayudarte. cualquier cosa me mantengo atento

0voto

top21tk comentado

En verdad el desarrollo surgió de una necesidad y no de un proyecto previo, pero por sobre todo, me cuesta mucho trabajar con POO aunque hice algunos ejercicios cuando estudié php y pude ver sus beneficios.

Muchas gracias.

0voto

Leonardo-Tadei comentado

Interesante planteo @Jesusmaster la cuestión de pasar esto a POO.

cómo resolverías esto desde un Modelo de Objetos? Cómo resolverías el la cuestión del desajuste de impedancia del paradigma relacional como el de la POO?

0voto

Jesusmaster comentado

estimado amigo, solamente le estoy haciendo una salvedad a su problema, la pregunta del amigo @top21tk fue como trabajaria mejor el servidor, y le respondo que en query separadas,(al parecer los resultados son diferentes por linea <li> entonces se me hace erroneo generar UNION de tablas al menos sin mirar el modelo), y para poder hacerlo lo mas eficiente es que utilice POO. claramente el servidor es mucho mas eficiente si se trabaja con POO que con programación estructurada. saludos.

@top21tk puedes mostrarnos tu modelo de datos?

1voto

Leonardo-Tadei comentado

Hola @Jesusmaster,

gracias por la respuesta y la aclaración. Tal y como decís, tal vez no se pueda hacer una query con UNION, por eso pongo como precondición que las tablas sean isomórficas, al menos respecto de esta consulta.

Por otra parte, acá usamos POO para todo lo que se puede, porque es un gran paradigma de programación, pero no es más eficiente que la PE a la hora de trabajar con bases de datos, ya que la conexión con la DB se hace con exactamente la misma biblioteca, y la capa extra para resolver el desajuste por impedancia de modeloes que requiere la POO para usar una DB hace que se consuma un poco más de RAM y de CPU. Tendrías algún enlace o libro de referencia en dónde se desarrolle esta idea de que la POO es más eficiente para el servidor?

Saludos cordiales!

0voto

top21tk comentado

HOla.
Por unos días podrás ver la estructura en este link
Saludos

4votos

Leonardo-Tadei Puntos227010

Hola @top21tk,

te conviene más una sola query que devuelva todo lo que te hace falta, pero no con las tablas que estás usando!

En la tabla "diario" es muy ineficiente filtrar los datos por un campo de texto: deberías tener codificados los tipos de eventos. El ORDER BY es innecesario porque la query siempre devolverá un solo día.

En la tabla "personal" parecioera que no estás guardando la fecha de nacimiento en un campo DATE por lo que estás buscando como string, lo cual es también ineficiente comparado con las funcionda de comparación de fechas.

Lo ideal sería que tengas tablas isomórficas respecto de la query de las novedades y que puedas hacer una única query con UNION teniendo en el WHERE la selección por fecha y discriminando en cada tabla por "tipo de evento" lo que quieras que aparezca.

Recordá porner un índice por fecha en todas las tablas así el filtro principal está indexado y no hay que calcularlo.

Saludos!

0voto

top21tk comentado

Hola Leonardo.
Son buenas tus observaciones, pero aceptando que tienes razón, debo decirte que las consultas fueron copiadas (para este caso) tal cual las utilizaba para otra cosa, Ej. Debería tener un campo en la tabla diario con el id del personal para poder filtrar los datos de un docente en particular. Como ese no es el caso, y la entrada de datos no está estandarizada, debo buscar en todos los campos de texto si ha sido mencionado el docente, por ej. para saber las veces que faltó. Eso explica también que lo ordene por fecha.
Respecto de la tabla personal, efectivamente, la fecha de nacimiento la guardo en un campo de fecha. Esa tabla, ha sido importada de una base de datos access preexistente por lo que debo mantener la estructura para importar los docentes nuevos, porque (por ahora) se cargan en la otra base de datos.
Respecto a las tablas con una misma estructura, me parece que no podré hacerlo por cuanto se trata de tablas que almacenan datos muy diferentes.
Como verás, hay datos de personas, de planes de estudio, de inasistencias, etc. etc.
La idea de concentrar todas las novedades en una sola pantalla me surgió ahora y los "eventos" que quiero mostrar son muy diferentes, pero se sintetiza en el hecho de que necesito que todos se enteren cuando en una de las siguientes tablas hay un dato con la fecha actual:
Diario (novedades del día - por ahora tambien licencias)
Alumnos (si hay un alumno nuevo o si cumple año y cuantos han ingresado en %2016)
Matriculas (si un alumno tiene baja en la fecha actual)
Personal ( si hay un docente nuevo o cumple años en la fecha actual -busco en nacimiento "%-m-d")
Exámenes ( si hay exámenes en la fecha actual, cuantos rinden y quien preside el tribunal)
Planes (si este año cambia el plan de una carrera, se carga con fecha actual)
Cursos ( si un curso tiene fecha de inicio hoy).

Estoy pensando que hay novedades que deben mostrarse en una fecha determinada, pero otras deben permanecer mas tiempo asique pensé que podría clasificarlas en eventos de un día y eventos de un mes, es decir, estos últimos mostrarlos todo el mes. Ej. Si hay una novedad en la tabla diario cuyo evento es "licencia", mostrarla todo el mes, dicho mes se tomaría de la fecha del evento.
Ej. Como muestro mas abajo, la licencia de Juan debería mostrarse durante todo el mes de febrero. Luego, tendré un problema si la licencia comienza el último día del mes :(

Volviendo a tu comentario:
En cuanto crear un campo con el tipo de evento, solamente lo tenía pensado para la tabla "diario" de donde salen las novedades(esta tabla también es importada). De modo que el campo título almacene el tipo de evento. Ej.

Fecha           Evento(titulo)          Detalle
01-02-2016      Licencia                Juan licencia..
01-02-2016      Calendario              Comienza curso..
02-03-2016      Curso                   Técnicas estudio..

Podrás ver la estructura en el comentario a la respuesta de @Jesusmaster

Finalmente debo decirte que lo hice con varias consultas, lo que me permitió agregar en la lista algún texto específico para esa consulta sql.
Igualmente sigo pensando si no será mas efectivo una sola consulta aunque los mensajes resultantes sean menos "amables" y mas secos. Ej. * Mesa filosofía (2) Perez

Por unos pocos días podrás ver una toma de pantalla aquí

Saludos.

3votos

Leonardo-Tadei comentado

Hola @top21tk,

con el escenario que describís, las tablas mal normalizadas y el no poder mejorar el modelo de datos para que sea más decente, la cuestión de hacer 1 query o varias querys es tu menor problema de rendimiento :-(

Al menos, definí índices para agilizar la búsqueda por los criterios de filtrado!

La excusa de seguir aceptando los datos del otro programa no es válida: bien podrías leerlos y pasarlos a otra estructura al momento de importarlos!

Dadas estas condiciones, creo que lo que te queda por hacer es comparar (usando PHPMyAdmin por ejemplo) el tiempo de las 3 querys seguidas contra el tiempo de 1 sola query con UNION y comparar la diferencia. La query con UNION no será elegante de ver, porque deberás tener subcondiciones de filtrado, pero tal vez haga mejor uso de la caché del RDBMS que 3 consultas aisladas... igual, solo queda probar y medir.

Saludos cordiales!

0voto

top21tk comentado

Muchas gracias Leonardo.
Me queda claro que tu preferencia es una sola consulta.
Saludos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta