Hay diferencias a la hora de usar joins y a la hora de hacer lo mismo
en el where?
Talvez erróneamente pensaba que era lo mismo. Me equivoco?
De ser asi tendría que reescribir el query.
Saludos
Nico.
Rodriguez Fernando escribió:
Nicolás
Domínguez Florit wrote:
Hola Fernando, hola lista!
Luego de probar de agregar los índices que me recomendó fernando, la
consulta tardo 20 minutos menos.
Les paso el nuevo explain analyze:
http://explain-analyze.info/query_plans/1521-nicolasdom-siu-2
Se les ocurre algo mas para que mejore? ya que 1 hora me parece que es
mucho tiempo.
Muchas Gracias!
Nicolas.
Rodriguez Fernando escribió:
tenes indices sobre las tablas?, si no los
tenes, se me ocurren los siguientes (verificale los nombres) :
rrhh_cubo_publicado_810 cod_rrhh_importacion + cod_institucion
rrhh_cargos. cod_rrhh_importacion + cod_rrhh_escalafon +
cod_rrhh_nivel_ensenianza + numero_cargo
rrhh_detalles_liquidaciones_haberes cod_rrhh_importacion
rrhh_escalafones_universidades cod_rrhh_importacion +
cod_rrhh_escalafon + cod_cargo_universidad
rrhh_cargos cod_rrhh_importacion + cod_rrhh_escalafon +
cod_cargo_universidad
Saludos Fernando
Nicolás Domínguez Florit wrote:
Tengo una consulta que me esta tardando
mucho y me gustaría que cuando tengan unos minutos le echen un vistazo
para ver si se les ocurre algo. Les paso las tabas, los registros de
cada tabla, la consulta y el explain analyze.
Uso un motor 8.2.4,
Tablas:
-------
CREATE TABLE rrhh_cargos
(
numero_cargo numeric(9) NOT NULL,
cod_ona_unidad_academica integer NOT NULL,
cod_ona_rama character(4) NOT NULL,
cod_ona_disciplina character(4) NOT NULL,
cod_ona_area character(4) NOT NULL,
cod_fuente_financiamiento numeric(2) NOT NULL,
cod_rrhh_importacion integer NOT NULL,
cuil_cuit numeric(11) NOT NULL,
cod_cargo_universidad character(4) NOT NULL,
cod_rrhh_estado_laboral integer NOT NULL,
cod_rrhh_estado_cargo character(1),
cod_rrhh_tipo_planta character(1) NOT NULL,
cod_rrhh_situacion_laboral integer NOT NULL,
cod_rrhh_agrupamiento_no_docente character(1),
cod_rrhh_nivel_ensenianza integer NOT NULL,
grado numeric(1) NOT NULL,
horas_dedicacion numeric(2) NOT NULL,
meses_antiguedad numeric(3) NOT NULL,
anios_antiguedad numeric(2) NOT NULL,
fecha_alta date NOT NULL,
fecha_baja date,
cod_dependencia numeric(2) NOT NULL,
cod_sub_dependencia numeric(2) NOT NULL,
programa numeric(2) NOT NULL,
subprograma numeric(2) NOT NULL,
proyecto numeric(2) NOT NULL,
actividad numeric(2) NOT NULL,
jefatura character(1) NOT NULL,
cod_rrhh_equivalencia_cargo integer NOT NULL,
cod_rrhh_escalafon character(1) NOT NULL,
numero_cargo_persona integer,
dedicacion_docente numeric(5,2),
dedicacion_investigacion numeric(5,2),
dedicacion_extension numeric(5,2),
dedicacion_gestion numeric(5,2),
CONSTRAINT rrhh_cargos_pkey PRIMARY KEY (numero_cargo,
cod_rrhh_importacion),
CONSTRAINT rrhh_cargos_cod_cargo_universidad_fkey FOREIGN KEY
(cod_cargo_universidad, cod_rrhh_escalafon, cod_rrhh_importacion)
REFERENCES rrhh_escalafones_universidades (cod_cargo_universidad,
cod_rrhh_escalafon, cod_rrhh_importacion) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_fuente_financiamiento_fkey FOREIGN KEY
(cod_fuente_financiamiento)
REFERENCES fuentes_financiamiento (cod_fuente_financiamiento)
MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_ona_rama_fkey FOREIGN KEY (cod_ona_rama,
cod_ona_disciplina, cod_ona_area)
REFERENCES ona_jerarquias (cod_ona_rama, cod_ona_disciplina,
cod_ona_area) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_ona_unidad_academica_fkey FOREIGN KEY
(cod_ona_unidad_academica)
REFERENCES ona_unidades_academicas (cod_ona_unidad_academica)
MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_rrhh_agrupamiento_no_docente_fkey FOREIGN
KEY (cod_rrhh_agrupamiento_no_docente)
REFERENCES rrhh_agrupamientos_no_docentes
(cod_rrhh_agrupamiento_no_docente) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_rrhh_equivalencia_cargo_fkey FOREIGN KEY
(cod_rrhh_equivalencia_cargo, cod_rrhh_escalafon)
REFERENCES rrhh_equivalencias_cargos
(cod_rrhh_equivalencia_cargo, cod_rrhh_escalafon) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_rrhh_estado_cargo_fkey FOREIGN KEY
(cod_rrhh_estado_cargo)
REFERENCES rrhh_estados_cargos (cod_rrhh_estado_cargo) MATCH
SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_rrhh_estado_laboral_fkey FOREIGN KEY
(cod_rrhh_estado_laboral)
REFERENCES rrhh_estados_laborales (cod_rrhh_estado_laboral) MATCH
SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_rrhh_nivel_ensenianza_fkey FOREIGN KEY
(cod_rrhh_nivel_ensenianza)
REFERENCES rrhh_niveles_ensenianza (cod_rrhh_nivel_ensenianza)
MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_rrhh_situacion_laboral_fkey FOREIGN KEY
(cod_rrhh_situacion_laboral)
REFERENCES rrhh_situaciones_laborales
(cod_rrhh_situacion_laboral) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cod_rrhh_tipo_planta_fkey FOREIGN KEY
(cod_rrhh_tipo_planta)
REFERENCES rrhh_tipos_planta (cod_rrhh_tipo_planta) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_cargos_cuil_cuit_fkey FOREIGN KEY (cuil_cuit,
cod_rrhh_importacion)
REFERENCES rrhh_datos_personales (cuil_cuit,
cod_rrhh_importacion) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT
) ;
-- cantidad de registros: 1.749.254
CREATE TABLE rrhh_escalafones_universidades
(
cod_cargo_universidad character(4) NOT NULL,
cod_rrhh_equivalencia_cargo integer NOT NULL,
cod_rrhh_escalafon character(1) NOT NULL,
cod_rrhh_importacion integer NOT NULL,
cod_rrhh_nivel_ensenianza integer NOT NULL,
descripcion character varying(30) NOT NULL,
dedicacion character varying(30) NOT NULL,
horas_dedicacion numeric(2) NOT NULL,
sueldo_basico numeric(10,2) NOT NULL,
remunerativo_bonificable numeric(10,2) NOT NULL,
remunerativo_no_bonificable numeric(10,2) NOT NULL,
no_remunerativo_bonificable numeric(10,2) NOT NULL,
no_remunerativo_no_bonificable numeric(10,2) NOT NULL,
otra_remuneraciones numeric(10,2) NOT NULL,
decreto_1610 numeric(10,2) NOT NULL,
gastos_representacion numeric(10,2) NOT NULL,
CONSTRAINT rrhh_escalafones_universidades_pkey PRIMARY KEY
(cod_cargo_universidad, cod_rrhh_escalafon, cod_rrhh_importacion),
CONSTRAINT
rrhh_escalafones_universidades_cod_rrhh_equivalencia_cargo_fkey FOREIGN
KEY (cod_rrhh_equivalencia_cargo, cod_rrhh_escalafon)
REFERENCES rrhh_equivalencias_cargos
(cod_rrhh_equivalencia_cargo, cod_rrhh_escalafon) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_escalafones_universidades_cod_rrhh_importacion_fkey
FOREIGN KEY (cod_rrhh_importacion)
REFERENCES rrhh_importaciones (cod_rrhh_importacion) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT
rrhh_escalafones_universidades_cod_rrhh_nivel_ensenianza_fkey FOREIGN
KEY (cod_rrhh_nivel_ensenianza)
REFERENCES rrhh_niveles_ensenianza (cod_rrhh_nivel_ensenianza)
MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT
) ;
-- cantidad de registros: 24.063
CREATE TABLE rrhh_cubo_publicado_810
(
cod_rrhh_importacion integer,
cod_pedido integer,
cod_institucion integer,
periodo date,
fecha_desde timestamp without time zone,
fecha_publicacion timestamp with time zone
) ;
-- cantidad de registros: 283
CREATE TABLE rrhh_detalles_liquidaciones_haberes
(
cod_rrhh_concepto_liquidacion_haberes numeric(6) NOT NULL,
cod_rrhh_importacion integer NOT NULL,
numero_cargo numeric(9) NOT NULL,
importe numeric(12,2) NOT NULL,
anio_retroactivo numeric(4) NOT NULL,
mes_retroactivo numeric(2) NOT NULL,
CONSTRAINT
rrhh_detalles_liquidaciones_h_cod_rrhh_concepto_liquidacio_fkey FOREIGN
KEY (cod_rrhh_concepto_liquidacion_haberes, cod_rrhh_importacion)
REFERENCES rrhh_conceptos_liquidaciones_haberes
(cod_rrhh_concepto_liquidacion_haberes, cod_rrhh_importacion) MATCH
SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT
rrhh_detalles_liquidaciones_haberes_cod_rrhh_importacion_fkey FOREIGN
KEY (cod_rrhh_importacion)
REFERENCES rrhh_importaciones (cod_rrhh_importacion) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT rrhh_detalles_liquidaciones_haberes_numero_cargo_fkey
FOREIGN KEY (numero_cargo, cod_rrhh_importacion)
REFERENCES rrhh_cargos (numero_cargo, cod_rrhh_importacion) MATCH
SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT
) ;
-- cantidad de registros: 29.566.415
Consulta:
---------
explain analyze
select t.periodo,
t.cod_institucion,
ca.numero_cargo,
ca.cuil_cuit,
ca.cod_rrhh_escalafon,
ca.cod_cargo_universidad,
eu.descripcion as categ_univ_descripcion,
eu.dedicacion as categ_univ_dedicacion,
ca.cod_rrhh_equivalencia_cargo,
ca.cod_ona_unidad_academica,
ca.cod_fuente_financiamiento,
ca.cod_rrhh_estado_laboral,
ca.cod_rrhh_estado_cargo,
ca.cod_rrhh_tipo_planta,
ca.cod_rrhh_situacion_laboral,
ca.cod_rrhh_nivel_ensenianza,
ca.meses_antiguedad,
ca.horas_dedicacion,
ca.numero_cargo_persona as nro_cargo_pers,
ca.cod_rrhh_agrupamiento_no_docente,
d.cod_rrhh_concepto_liquidacion_haberes,
d.anio_retroactivo,
d.mes_retroactivo,
d.importe,
1 as Cant_ConceptosXCargos from rrhh_cargos ca,
rrhh_escalafones_universidades eu,
rrhh_cubo_publicado_810 t,
rrhh_detalles_liquidaciones_haberes d
where t.cod_institucion<>7 and
ca.cod_rrhh_importacion=t.cod_rrhh_importacion
and eu.cod_cargo_universidad = ca.cod_cargo_universidad
and eu.cod_rrhh_importacion = ca.cod_rrhh_importacion
and eu.cod_rrhh_escalafon = ca.cod_rrhh_escalafon
and (ca.cod_rrhh_escalafon = 'D') and (ca.cod_rrhh_nivel_ensenianza = 1
)
and d.cod_rrhh_importacion=t.cod_rrhh_importacion
and d.numero_cargo = ca.numero_cargo
Explain Analyze:
-----------------
http://explain-analyze.info/query_plans/1499-nicolasdom-siu
Antes de correr la consulta se habia realizado:
analyze rrhh_cargos;
analyze rrhh_escalafones_universidades;
analyze rrhh_cubo_publicado_810;
analyze rrhh_detalles_liquidaciones_haberes ;
Muchas Gracias!
Nicolas.
--
TIP 4: No hagas 'kill -9' a postmaster
Puede que parezca manotazo de ahogado, pero para probar, podrias
utilizar join's en lugar de producto cartesiano, con lo cual en el
where solo te
quedarian los filtros :
t.cod_institucion<>7 and
(ca.cod_rrhh_escalafon = 'D') and (ca.cod_rrhh_nivel_ensenianza = 1 )
Saludos Fernando
--
TIP 4: No hagas 'kill -9' a postmaster