Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 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
  #2  
Antiguo 16-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Muchísimas gracias. Tus explicaciones me enseñan muchas cosas que desconozco.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
a vueltas con los servidores de datos anubis Varios 11 13-01-2010 09:37:42
Dando vueltas con las capas CHiCoLiTa Providers 0 24-01-2006 12:09:55
Dandolo vueltas a un indice gario Oracle 0 17-03-2005 14:04:47


La franja horaria es GMT +2. Ahora son las 20:12:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi