MySQL - PROBLEMAS QUERY CON GRANDES TABLAS

 
Vista:

PROBLEMAS QUERY CON GRANDES TABLAS

Publicado por wilmer8 (2 intervenciones) el 20/10/2009 21:01:53
HOLA A TODOS.

El motivo de mi consulta es la siguiente dado qeu yo es una duda muy facil en bases de datos MYSQL.
Resulta que me encuentro trabajando unas serie de consulticas en una base de datos con tabls de 500000registros, 400000 registros y necesito hacer una consulta que me las relacione pero el computador se me muere pensando .
mire la consulta es la siguiente en MYSQL :

SELECT fecha2, fechasolicitud, NumeroCuenta2, NombreOficina2, NombrePop2,Nuip,ValorTotal2 FROM dniproduccion JOIN bancopopulardos ON dniproduccion.Nuip=bancopopulardos.Identificacion ;

A ver les cuento son 2 tablas dniproduccion y bancopopulardos cada uno con aproximadamente 5000000 registros, necesito sacar los registros donde las columnas Identiciacion(popular2 es la tabla) y Nuip( dniproduccion es la tabla) coincidan y listo.

en cada columna Identificacion y Nuip tengo un indice asociado a ellas.
asi las definiciones de las tablas son:
CREATE TABLE `bancopopulardos` (
`fecha2` varchar(15) DEFAULT NULL,
`NumeroCuenta2` bigint(20) DEFAULT NULL,
`Oficina` smallint(6) DEFAULT NULL,
`NombreOficina2` varchar(40) DEFAULT NULL,
`CHEQCANJE` bigint(20) DEFAULT NULL,
`CHQBPOPULAR` bigint(20) DEFAULT NULL,
`Efectivo` bigint(20) DEFAULT NULL,
`ValorTotal2` bigint(20) DEFAULT NULL,
`NumDocumento` bigint(20) DEFAULT NULL,
`Jornada` smallint(6) DEFAULT NULL,
`NombrePop2` varchar(40) DEFAULT NULL,
`Identificacion` bigint(20) DEFAULT NULL,
`itemfinal` varchar(2) DEFAULT NULL,
KEY `indicepopular2` (`Identificacion`))

CREATE TABLE `dniproduccion` (
`numpreparacion` bigint(20) DEFAULT NULL,
`fechasolicitud` varchar(20) DEFAULT NULL,
`Nuip` varchar(20) DEFAULT NULL,
`IdClasExp` bigint(20) DEFAULT NULL,
`CodRectificacion` varchar(5) DEFAULT NULL,
`item` varchar(10) DEFAULT NULL,
`CodOficina` varchar(10) DEFAULT NULL,
`Nombre1` varchar(30) DEFAULT NULL,
`Nombre2` varchar(30) DEFAULT NULL,
`Apellido1` varchar(30) DEFAULT NULL,
`Particula` varchar(30) DEFAULT NULL,
`Apellido2` varchar(30) DEFAULT NULL,
`Sexo` varchar(5) DEFAULT NULL,
KEY `indiceproduccion` (`Nuip`))
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:PROBLEMAS QUERY CON GRANDES TABLAS

Publicado por Gonzalo GC (339 intervenciones) el 22/10/2009 16:15:23
JOIN genera unproducto cartesiano.
Usa mejor INNER JOIN:

SELECT
fecha2,
fechasolicitud,
NumeroCuenta2,
NombreOficina2,
NombrePop2,
Nuip,
ValorTotal2
FROM dniproduccion DNI
INNER JOIN bancopopulardos BP ON DNI.Nuip = BP.Identificacion ;

De todos modos, el problema es que no te devolvera pocos registros, a menos que reduzcas la selectividad. Piensa que si una tabla contiene 5.000.000 de registros y la otra 4.000.000 de registros, y hay una relacion 1:1, lo menos que te devovlerá es 4.000.000 de registros...
¿Qué vas a hacer con semejante tabla de datos? Esto no es un resultado que vayas a leer o imprimir (solamente imprimir en hoja tamaño A4 a 10 puntos te insumiría 50.000 páginas, o lo que es lo mismo 100 resmas de papel)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS QUERY CON GRANDES TABLAS

Publicado por wilmer8 (2 intervenciones) el 22/10/2009 17:40:02
disculpenme las tablas son de datos de 550000 y 400000 nada mas, con ellas busco extraer informacion basados en la informacion de una columna determinada en cada caso.
Respecto al Inner Join realmente no mejoro la funcionalidad del sistema.
ahora estoy probando counsulta por consulta asi:

Por ejemplo tengo conusltas de este tipo

SELECT SUM(ValorTotal2)AS Suma2 FROM dniproduccion INNER JOIN bancopopulardos ON dniproduccion.Nuip = bancopopulardos.Identificacion;

donde gasta casi 15 minutos el computador.

por ejemplo se me murere en un tipo de consutla asi:
SELECT SUM((SELECT SUM(ValorTotalp) AS Sumap FROM bancopopularpin INNER JOIN dniproduccion ON bancopopularpin.Identificacion = dniproduccion.Nuip)+(SELECT SUM(ValorTotal1) AS Suma1 FROM bancopopularuno INNER JOIN dniproduccion ON bancopopularuno.NoIdentificacion = dniproduccion.Nuip)+(SELECT SUM(ValorTotal2)AS Suma2 FROM dniproduccion INNER JOIN bancopopulardos ON dniproduccion.Nuip = bancopopulardos.Identificacion)+(SELECT SUM(ValorTotala) AS Sumaag FROM dniproduccion INNER JOIN bancoagrario ON dniproduccion.Nuip = bancoagrario.nocedula)) AS SumaTotal ;

no se si exiista un amejor forma para esta consutla donde lo que busco es sumar datos de 4 diferentes tablas que cumplen unas compaaraciones entre columnas.

agradezco
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS QUERY CON GRANDES TABLAS

Publicado por Gonzalo GC (339 intervenciones) el 23/10/2009 03:34:19
Bueno, hay mucho por andar...

La consulta que usiste es una de las más ineficientes que he visto en muuucho tiempo.
Ten en cuenta que tal como la escribes realiza un INNER JOIN por separado para obtener cada subvalor que debe sumarse. Imagínate lo que puede tardar.
Además, ¿para qué separarlos, si en definitiva se sumarán todos aquellos donde coincidan los valores.
Es mejor hacerlo de dos formas.
Si quieres hacer la suma y discriminarla por cada Nuid diferente, la cosa sería:

SELECT Nuip, SUM(ValorTotalp + ValorTotal1 + ValorTotal2 + ValorTotala) SumaTotal
FROM bancopopularpin BPP
INNER JOIN dniproduccion DN ON BPP.Identificacion = DN.Nuip
INNER JOIN bancopopularuno BPU ON BPU.Identificacion = DN.Nuip
INNER JOIN bancopopulardos BPD ON BPD.Identificacion = DN.Nuip
INNER JOIN bancoagrario BA ON DN.Nuip = BA.nocedula
GROUP BY DN.Nuip;

Si lo que quieres fuera la suma total de los clientes comunes a todos los bancos:

SELECT SUM(ValorTotalp + ValorTotal1 + ValorTotal2 + ValorTotala) SumaTotal
FROM bancopopularpin BPP
INNER JOIN dniproduccion DN ON BPP.Identificacion = DN.Nuip
INNER JOIN bancopopularuno BPU ON BPU.Identificacion = DN.Nuip
INNER JOIN bancopopulardos BPD ON BPD.Identificacion = DN.Nuip
INNER JOIN bancoagrario BA ON DN.Nuip = BA.nocedula;

Sigue siendo algo ineficiente, peor al menos no creo que puera haciendo el cálculo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar