Paso a responder por puntos
Tabla: mdp_personas
iu_mdp_personas_apellido_nombres
SI ESTABA EL INDICE
Tabla: mdp_personas_documentos
id_tipo_documento_nro_documento
iu_pais_tipo_nro_documento
iu_persona_pais_tipo_documento
SI ESTABAN LOS INDICES
fk en la tabla mdp_personas_documentos:
fk_mdp_personas_documentos_mdp_personas
NO ESTABA PRESENTE, AHORA FUÉ AGREGADO
¿Tienen creada la PK en la tabla mdp_personas_documentos?
SI ESTABA LA PK
Paso el resultado del Explain con las indicaciones previas
"Sort (cost=122809517.12..122809517.13 rows=2 width=312)"
" Sort Key: mdp_personas.apellido, mdp_personas.nombres"
" -> Unique (cost=122809517.09..122809517.11 rows=2 width=312)"
" -> Sort (cost=122809517.09..122809517.09 rows=2 width=312)"
" Sort Key: mdp_personas.persona, mdp_personas.apellido, mdp_personas.nombres, ((((mdp_tipo_documento.desc_abreviada)::text || ' '::text) || (mdp_personas_documentos.nro_documento)::text))"
" -> Append (cost=8.45..122809517.08 rows=2 width=312)"
" -> Nested Loop Left Join (cost=8.45..2951.17 rows=1 width=59)"
" Join Filter: (mdp_tipo_documento.tipo_documento = mdp_personas_documentos.tipo_documento)"
" -> Hash Join (cost=8.45..2949.91 rows=1 width=39)"
" Hash Cond: (mdp_personas.documento_principal = mdp_personas_documentos.documento)"
" -> Seq Scan on mdp_personas (cost=0.00..2712.23 rows=87323 width=31)"
" -> Hash (cost=8.44..8.44 rows=1 width=16)"
" -> Index Scan using id_tipo_documento_nro_documento on mdp_personas_documentos (cost=0.42..8.44 rows=1 width=16)"
" Index Cond: ((nro_documento)::text = '25985556'::text)"
" -> Seq Scan on mdp_tipo_documento (cost=0.00..1.11 rows=11 width=22)"
" -> Subquery Scan on ""*SELECT* 2"" (cost=122806565.86..122806565.89 rows=1 width=59)"
" -> Group (cost=122806565.86..122806565.88 rows=1 width=89)"
" Group Key: mdp_personas_1.persona, mdp_tipo_documento_1.desc_abreviada, mdp_personas_documentos_1.nro_documento"
" -> Sort (cost=122806565.86..122806565.87 rows=1 width=57)"
" Sort Key: mdp_personas_1.persona, mdp_tipo_documento_1.desc_abreviada"
" -> Hash Join (cost=4868.28..122806565.85 rows=1 width=57)"
" Hash Cond: (mdp_personas_1.documento_principal = mdp_personas_documentos_1.documento)"
" -> Merge Left Join (cost=4858.58..122806544.45 rows=3119 width=31)"
" Merge Cond: (mdp_personas_1.persona = mdp_personas_perfil_datos.persona)"
" Filter: ((mdp_personas_perfil_datos.usuario_perfil_datos IS NULL) OR (apex_usuario_perfil_datos_dims.clave = '2'::text))"
" -> Index Scan using pk_mdp_personas on mdp_personas mdp_personas_1 (cost=4827.14..122806399.46 rows=43662 width=31)"
" Filter: (NOT (SubPlan 1))"
" SubPlan 1"
" -> Materialize (cost=4826.85..7310.95 rows=131340 width=4)"
" -> HashAggregate (cost=4826.85..6140.25 rows=131340 width=4)"
" Group Key: sga_alumnos.persona"
" -> Append (cost=0.00..4498.50 rows=131340 width=4)"
" -> Seq Scan on sga_alumnos (cost=0.00..2498.36 rows=129536 width=4)"
" -> Seq Scan on sga_docentes (cost=0.00..30.04 rows=1804 width=4)"
" -> Sort (cost=31.44..32.41 rows=391 width=44)"
" Sort Key: mdp_personas_perfil_datos.persona"
" -> Hash Left Join (cost=1.32..14.60 rows=391 width=44)"
" Hash Cond: (mdp_personas_perfil_datos.usuario_perfil_datos = apex_usuario_perfil_datos_dims.usuario_perfil_datos)"
" -> Seq Scan on mdp_personas_perfil_datos (cost=0.00..7.91 rows=391 width=12)"
" -> Hash (cost=1.14..1.14 rows=14 width=40)"
" -> Seq Scan on apex_usuario_perfil_datos_dims (cost=0.00..1.14 rows=14 width=40)"
" -> Hash (cost=9.68..9.68 rows=1 width=34)"
" -> Nested Loop Left Join (cost=0.42..9.68 rows=1 width=34)"
" Join Filter: (mdp_tipo_documento_1.tipo_documento = mdp_personas_documentos_1.tipo_documento)"
" -> Index Scan using id_tipo_documento_nro_documento on mdp_personas_documentos mdp_personas_documentos_1 (cost=0.42..8.44 rows=1 width=16)"
" Index Cond: ((nro_documento)::text = '25985556'::text)"
" -> Seq Scan on mdp_tipo_documento mdp_tipo_documento_1 (cost=0.00..1.11 rows=11 width=22)"
y a continuación agrego el índice:
CREATE INDEX idx_mdp_personas_documento_principal ON mdp_personas (documento_principal);
y paso de nuevo el resultado del Explain
"Sort (cost=6270.77..6270.77 rows=2 width=312)"
" Sort Key: mdp_personas.apellido, mdp_personas.nombres"
" -> Unique (cost=6270.73..6270.76 rows=2 width=312)"
" -> Sort (cost=6270.73..6270.74 rows=2 width=312)"
" Sort Key: mdp_personas.persona, mdp_personas.apellido, mdp_personas.nombres, ((((mdp_tipo_documento.desc_abreviada)::text || ' '::text) || (mdp_personas_documentos.nro_documento)::text))"
" -> Append (cost=0.71..6270.72 rows=2 width=312)"
" -> Nested Loop Left Join (cost=0.71..18.01 rows=1 width=59)"
" Join Filter: (mdp_tipo_documento.tipo_documento = mdp_personas_documentos.tipo_documento)"
" -> Nested Loop (cost=0.71..16.76 rows=1 width=39)"
" -> Index Scan using id_tipo_documento_nro_documento on mdp_personas_documentos (cost=0.42..8.44 rows=1 width=16)"
" Index Cond: ((nro_documento)::text = '25985556'::text)"
" -> Index Scan using idx_mdp_personas_documento_principal on mdp_personas (cost=0.29..8.31 rows=1 width=31)"
" Index Cond: (documento_principal = mdp_personas_documentos.documento)"
" -> Seq Scan on mdp_tipo_documento (cost=0.00..1.11 rows=11 width=22)"
" -> Subquery Scan on ""*SELECT* 2"" (cost=6252.66..6252.69 rows=1 width=59)"
" -> Group (cost=6252.66..6252.68 rows=1 width=89)"
" Group Key: mdp_personas_1.persona, mdp_tipo_documento_1.desc_abreviada, mdp_personas_documentos_1.nro_documento"
" -> Sort (cost=6252.66..6252.67 rows=1 width=57)"
" Sort Key: mdp_personas_1.persona, mdp_tipo_documento_1.desc_abreviada"
" -> Nested Loop Left Join (cost=4827.90..6252.65 rows=1 width=57)"
" Join Filter: (mdp_tipo_documento_1.tipo_documento = mdp_personas_documentos_1.tipo_documento)"
" -> Nested Loop Left Join (cost=4827.90..6251.41 rows=1 width=39)"
" Filter: ((mdp_personas_perfil_datos.usuario_perfil_datos IS NULL) OR (apex_usuario_perfil_datos_dims.clave = '2'::text))"
" -> Nested Loop (cost=4827.56..6249.84 rows=1 width=39)"
" -> Index Scan using id_tipo_documento_nro_documento on mdp_personas_documentos mdp_personas_documentos_1 (cost=0.42..8.44 rows=1 width=16)"
" Index Cond: ((nro_documento)::text = '25985556'::text)"
" -> Index Scan using idx_mdp_personas_documento_principal on mdp_personas mdp_personas_1 (cost=4827.14..6241.39 rows=1 width=31)"
" Index Cond: (documento_principal = mdp_personas_documentos_1.documento)"
" Filter: (NOT (SubPlan 1))"
" SubPlan 1"
" -> Materialize (cost=4826.85..7310.95 rows=131340 width=4)"
" -> HashAggregate (cost=4826.85..6140.25 rows=131340 width=4)"
" Group Key: sga_alumnos.persona"
" -> Append (cost=0.00..4498.50 rows=131340 width=4)"
" -> Seq Scan on sga_alumnos (cost=0.00..2498.36 rows=129536 width=4)"
" -> Seq Scan on sga_docentes (cost=0.00..30.04 rows=1804 width=4)"
" -> Hash Right Join (cost=0.33..1.55 rows=2 width=44)"
" Hash Cond: (apex_usuario_perfil_datos_dims.usuario_perfil_datos = mdp_personas_perfil_datos.usuario_perfil_datos)"
" -> Seq Scan on apex_usuario_perfil_datos_dims (cost=0.00..1.14 rows=14 width=40)"
" -> Hash (cost=0.31..0.31 rows=2 width=12)"
" -> Index Scan using ifk_mdp_personas_perfil_datos_mdp_personas_grupo_acc on mdp_personas_perfil_datos (cost=0.27..0.31 rows=2 width=12)"
" Index Cond: (persona = mdp_personas_1.persona)"
" -> Seq Scan on mdp_tipo_documento mdp_tipo_documento_1 (cost=0.00..1.11 rows=11 width=22)"
Estas modificaciones mejoran considerablemente la consulta! lo probé en Gestión y ahora responde en segundos. Todo esto lo probé en un entorno de Desarrollo, lo paso sin problemas a Producción?
Consulta: este último índice que se agrega: idx_mdp_personas_documento_principa es propio de la versión 3.18? Cuál puede ser el motivo por el cuál no lo teníamos en la BD?
Saludos!