Ver Mensaje Individual
  #20  
Antiguo 14-11-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
El número de los índices indica cuan específico es. Entiéndase cuan único es cada registro.
Si tienes una tabla ARTICULOS (EMPRESA, ARTICULO) y tienes los valores
Código:
1, ART1
1, ART2
1, ART3
1, ART4
un índice por EMPRESA tendrá estadística = 1, indicando que se repite para todos los registros
un índice por ARTICULO tendra estadística = 0,25, indicando que "se repite poco" (en este ejemplo nada) en todos los registros.
Por lo tanto, si el planificador de JOINs tiene la opción de usar uno de estos dos índices, preferirá el de artículo.

Nota: Un índice por EMPRESA+ARTICULO también tendra estadística = 0,25, indicando que "se repite poco" (en este ejemplo nada) en todos los registros.

Creo que estás haciendo el SQL de forma incorrecta.
Si no quieres filtrar por municipio, debes eliminar esa línea del WHERE.

Código SQL [-]
select p.codigo, p.nombre, coalesce(sum(r.votos), 0) votos, coalesce(n.electos, 0) electos, n.circunscripcion,
       po.nombre
from partidos p
join resultados r on r.partido = p.codigo and p.codprv = r.codprv
join mesas m on m.codprv = r.codprv and m.codigo = r.mesa
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo
left join numelectos n on r.codprv = n.codprv and r.proceso = n.proceso and n.tipo = 'M' and r.partido = n.partido and po.codigo = n.circunscripcion
where
p.codprv = 13 and
r.proceso = 42 
/* and m.municipio = 175 Muestra todos los municipios */ 
group by p.codigo, p.nombre, electos, n.circunscripcion, po.nombre
order by po.nombre, 3 /*votos*/ desc, 4 /*electos*/ desc, p.nombre

Suposición 1 - Agregas lo que mencionas al WHERE.
Si haces lo que que mencionas, estarás diciendo que muestre los registros donde el municipio de la mesa sea el municipio de la poblacion.
Esto ya está garantizado por los JOINs
join mesas m on m.codprv = r.codprv and m.codigo = r.mesa
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo

Solo le estarás complicando la vida al planificador.

Código SQL [-]
select p.codigo, p.nombre, coalesce(sum(r.votos), 0) votos, coalesce(n.electos, 0) electos, n.circunscripcion,
       po.nombre
from partidos p
join resultados r on r.partido = p.codigo and p.codprv = r.codprv
join mesas m on m.codprv = r.codprv and m.codigo = r.mesa
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo
left join numelectos n on r.codprv = n.codprv and r.proceso = n.proceso and n.tipo = 'M' and r.partido = n.partido and po.codigo = n.circunscripcion
where
p.codprv = 13 and
r.proceso = 42 
/* Muestra todos los municipios */ 
and m.municipio = po.codigo 
group by p.codigo, p.nombre, electos, n.circunscripcion, po.nombre
order by po.nombre, 3 /*votos*/ desc, 4 /*electos*/ desc, p.nombre


Suposición 2 - Quitas "m.municipio = po.codigo" del JOIN .
Si haces esto, estás cambiando los datos sobre los que haces los cálculos.
En ese caso, si tenemos en cuenta solo las tablas MESAS y POBLACION sería
Código SQL [-]
/* Original */
mesas m 
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo

/* Tu modificacion */
mesas m 
join poblacion po on p.codprv = po.codprv /*and m.municipio = po.codigo*/

En este caso cada mesa se uniría con todas las poblaciones y tendrías muchísimos registros más.
Prueba estos SQL:
Código SQL [-]
/* Esto te devuelve las mesas y su municipio*/
/* Devuelve 738 registros para la provincia 13 */
select m.codprv, m.codigo, m.municipio, po.codigo, po.nombre
from mesas m
join poblacion po on m.codprv = po.codprv and m.municipio = po.codigo
where
m.codprv = : prvins
order by m.codprv, m.codigo, m.municipio, po.codigo, po.nombre
Código SQL [-]
/* Esto te devuelve las mesas unidas a cada municipio (aunque no le corresponda) */
/* ATENCION - TARDARÁ MUCHO Y DEVOLVERA MILES DE REGISTROS */
/* Registros = 738 mesas x 58.655 poblaciones = 42.287.390 registros*/
select m.codprv, m.codigo, m.municipio, po.codigo, po.nombre
from mesas m
join poblacion po on m.codprv = po.codprv /* and m.municipio = po.codigo*/
where
m.codprv = : prvins
order by m.codprv, m.codigo, m.municipio, po.codigo, po.nombre

Última edición por duilioisola fecha: 14-11-2023 a las 20:01:47.
Responder Con Cita