Select y View
Posted by:
juan hernandez ()
Date: October 31, 2009 12:38PM
Hola a todos, tengo una base de datos llamada dbdatos, la cual tiene en su interior aproximamente 20.000 tablas. La extructura de cada tabla es la siguiente:
+-----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| CANTIDAD | decimal(19,2) | YES | | NULL | |
| PRODUCTO | varchar(60) | YES | | NULL | |
| PRECIO SIN IGIC | decimal(19,2) | YES | | NULL | |
| PRECIO CON IGIC | decimal(19,2) | YES | | NULL | |
| SUBTOTAL | decimal(19,2) | YES | | NULL | |
| TOTAL | decimal(19,2) | YES | | NULL | |
| PRECIO COSTO | decimal(19,2) | YES | | NULL | |
| TOTAL COSTO | decimal(19,2) | YES | | NULL | |
| DESCUENTO | decimal(19,2) | YES | | NULL | |
| IGIC | decimal(19,2) | YES | | NULL | |
| FAMILIA | varchar(60) | YES | | NULL | |
| SUBFAMILIA | varchar(60) | YES | | NULL | |
+-----------------+---------------+------+-----+---------+-------+
Imaginaros que cada tabla se llama t1, t2... así hasta t20000.
Para poder calcular los productos más vendidos en función de la factura, realizo lo siguiente:
1.- Creo un view de la siguiente forma:
CREATE OR REPLACE VIEW dbdatos.documentos AS SELECT * FROM dbdatos.t0 UNION ALL (SELECT * FROM dbdatos.t1)......, así hasta aproximadamente 20000 tablas (supongamos).
2.- Una vez creada la vista dbdatos.documentos, ejecuto un select de la siguiente forma:
SELECT Producto, sum(Cantidad) as Total FROM dbdatos.documentos WHERE `Producto`<>'' GROUP BY `Producto` order by Total DESC limit 2;
(lo del limit es para que veais el resultado, pero en realidad no usa el limit)
+----------------------+--------+
| Producto | Total |
+----------------------+--------+
| PEPINOS | 803.00 |
| TOMATES | 739.00 |
+----------------------+--------+
Tengo varios problemas:
1.- El más importante porque apesar de que tarden las consultas, si no soluciono este si que voy mal:
memory exhausted near ') UNION ALL (SELECT * FROM dbdatos.t5330) UNION ALL (SELECT * FROM dbdatos.t53' at line 1
parece ser que la cadena que le envío con todas las tablas juntas es muy larga u ocupa mucha memoria. He estado buscando sobre el error y poco he conseguido.
2.- ¿Véis alguna manera de agilizar todo?
Se que el hecho de tener 20000 tablas no es muy adecuado pero por ahora es la única solución.
Muchas gracias a todos.