Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/12/2012, 11:00
alyciashape
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Optimización de consultas

Últimamente ando manejando consultas muy grandes con PHP y ODBC a una DBase y tengo problemas de optimización continuamente. Al final lo que hago normalmente para ahorrar tiempo al script es hacer cosas así:

Código PHP:
Ver original
  1. $consulta_tabla_a = "SELECT * FROM tabla a";
  2. $consulta_tabla_b = "SELECT * FROM tabla b";
  3.  
  4. foreach ($consulta_tabla_a AS $tabla_a) {
  5. consulto en tabla b los datos relacionados con a
  6. }

A esto se puede añadir la variante de meter todos los datos en arrays y luego ir enlazandolos sin hacer consultas. Es la única manera que logro de mantener un tiempo de respuesta estable.

Pero ahora ya me encuentro totalmente atascada. Tengo que extraer el stock actual para todos los artículos. Para ello, debido al mal diseño de la base de datos, es contar los movimientos que tiene cada artículo hasta el día de hoy, desde 2008. Además como tenemos más de una empresa esos movimientos están ligados a empresas.

Por lo tanto. Hay unos 30 mil movimientos para 8 mil artículos que a su vez hay que conectar con las empresas, pero también quieren separar compras y ventas, así que tengo que conectarlo a los pedidos, albaranes y facturas. Como se puede ver la cantidad de datos es muy grande. Lo tenía así:

articulos = meto todos los datos en un array

por cada articulo consulto los movimientos de ese artículo y a que empresa corresponde y los voy metiendo un array los resultados.

El problema es que la consulta ya tarda unos 20 minutos o 30 y me parece excesivo. Quería reducirlo metiendo todos los movimientos en un array, pero me da error el apache de que me paso de 128 mb de memoria en una sóla consulta. Ampliar la memoria me parece una solución pero creo que es una animalada una consulta de 128 mb.

La duda es esa, si tenéis algún consejo para optimizar estos temas. Veo complicado el asunto.

Es mejor meter consultas en variables y trabajar con ellas desde ahí o lanzar muchas consultas pequeñas?

El mal diseño de la base de datos incluso me obliga a hacer diferencias entre facturas, albaranes y demás de años distintos pues los precios no son los que deberian y tengo que hacer calculos sobre ellos.

¿Como trabajais con consultas muy grandes?