Запрос в postgresql с низкой производительностью - PullRequest
0 голосов
/ 23 октября 2019

Пожалуйста, мне нужна помощь с этим чудовищным запросом, потому что загрузка его занимает более 3 минут и приводит к сбою в рабочей среде.

Я уже пытался создать представление для него, но ничегоизменилосьЯ пытался решить также, используя LATERAL в левых соединениях, но, возможно, я сделал это неправильно.

select t.*
from (select x.cod_company,
             y.nome_fantasia,
             x.nome                                                      as                  nome_da_funcao,
             remove_caracteres_especiais(replace(x.descricao, ';', '-')) as                  descricao_informacoes_adicionais,
             x.quantidade                                                as                  quatidade_de_vagas,
             tipo,
             (case when x.pcd = true then 'Sim' else 'Não' end)          as                  vaga_pcd,
             x.cod_escolaridade,
             x.cod_turno,
             x.salario::text,
             x.logradouro                                                as                  endereco,
             x.numero                                                    as                  numero_endereco,
             x.complemento,
             x.referencia,
             x.cep,
             x.bairro,
             case
                 when tgm.nome is null then y.cidade
                 else tgm.nome end                                       as                  municipio,
             case
                 when tgm.sigla_estado is null then tge.sigla_estado
                 else tgm.sigla_estado
                 end                                                     as                  uf,
             x.cod_state,
             x.data_cadastro::date,
             x.prazo                                                     as                  validade_do_anuncio,
             x.d_alimentacao                                             as                  auxilio_alimentacao,
             x.d_alimentacao,
             x.d_saude                                                   as                  plano_de_saude,
             x.d_transporte                                              as                  auxilio_transporte,
             x.d_outros                                                  as                  outros,
             e.nome                                                      as                  escolaridade_exigida,
             tu.nome                                                     as                  nome_turno,
             max(case when c.ordem = 1 then c.cod_area_atuacao else null end)                cod_cbo_area_atuacao_1,
             max(case when c.ordem = 1 then c.titulo else null end)                          descricao_cbo_areatuacao_1,
             max(case when c.ordem = 1 then c.exigido_desejavel else null end)               cod_tempo_experiencia_exigido_1,
             max(
                     case when c.ordem = 1 then c.tempo_experiencia_exigido else null end)   desc_tempo_experiencia_exigido_1,
             max(case when c.ordem = 2 then c.cod_area_atuacao else null end)                cod_cbo_area_atuacao_2,
             max(case when c.ordem = 2 then c.titulo else null end)                          descricao_cbo_areatuacao_2,
             max(case when c.ordem = 2 then c.exigido_desejavel else null end)               cod_tempo_experiencia_exigido_2,
             max(
                     case when c.ordem = 2 then c.tempo_experiencia_exigido else null end)   desc_tempo_experiencia_exigido_2,
             max(case when c.ordem = 3 then c.cod_area_atuacao else null end)                cod_cbo_area_atuacao_3,
             max(case when c.ordem = 3 then c.titulo else null end)                          descricao_cbo_areatuacao_3,
             max(case when c.ordem = 3 then c.exigido_desejavel else null end)               cod_tempo_experiencia_exigido_3,
             max(
                     case when c.ordem = 3 then c.tempo_experiencia_exigido else null end)   desc_tempo_experiencia_exigido_3,
             max(case when c.ordem = 4 then c.cod_area_atuacao else null end)                cod_cbo_area_atuacao_02,
             max(case when c.ordem = 4 then c.titulo else null end)                          descricao_cbo_areatuacao_02,
             max(case when c.ordem = 4 then c.exigido_desejavel else null end)               cod_tempo_experiencia_exigido_02,
             max(
                     case when c.ordem = 4 then c.tempo_experiencia_exigido else null end)   desc_tempo_experiencia_exigido,
             max(case when c.ordem = 5 then c.cod_area_atuacao else null end)                cod_cbo_area_atuacao,
             max(case when c.ordem = 5 then c.titulo else null end)                          descricao_cbo_areatuacao,
             max(case when c.ordem = 5 then c.exigido_desejavel else null end)               cod_tempo_experiencia_exigido_333,
             max(
                     case when c.ordem = 5 then c.tempo_experiencia_exigido else null end)   desc_tempo_experiencia_exigido_3333,
             max(case when c1.ordem = 1 then c1.cod_curso else null end)                     curso_complementar_cod_1,
             max(
                     case when c1.ordem = 1 then c1.curso_exigido_ou_desejado else null end) curso_complementar_exigido_desejado_1,
             max(case when c1.ordem = 1 then c1.denominacao else null end)                   curso_complementar_nome_1,
             max(case when c1.ordem = 2 then c1.cod_curso else null end)                     curso_complementar_cod_2,
             max(
                     case when c1.ordem = 2 then c1.curso_exigido_ou_desejado else null end) curso_complementar_exigido_desejado_2,
             max(case when c1.ordem = 2 then c1.denominacao else null end)                   curso_complementar_nome_2,
             max(case when c1.ordem = 3 then c1.cod_curso else null end)                     curso_complementar_cod_3,
             max(
                     case when c1.ordem = 3 then c1.curso_exigido_ou_desejado else null end) curso_complementar_exigido_desejado_3,
             max(case when c1.ordem = 3 then c1.denominacao else null end)                   curso_complementar_nome_3,
             max(case when c1.ordem = 4 then c1.cod_curso else null end)                     curso_complementar_cod_4,
             max(
                     case when c1.ordem = 4 then c1.curso_exigido_ou_desejado else null end) curso_complementar_exigido_desejado_4,
             max(case when c1.ordem = 4 then c1.denominacao else null end)                   curso_complementar_nome_4,
             max(case when c1.ordem = 5 then c1.cod_curso else null end)                     curso_complementar_cod_5,
             max(
                     case when c1.ordem = 5 then c1.curso_exigido_ou_desejado else null end) curso_complementar_exigido_desejado_5,
             max(case when c1.ordem = 5 then c1.denominacao else null end)                   curso_complementar_nome_5,
             max(case when c2.ordem = 1 then c2.cod_curso else null end)                     curso_tecnico_cod_1,
             max(
                     case when c2.ordem = 1 then c2.curso_exigido_ou_desejado else null end) curso_tecnico_exigido_desejado_1,
             max(case when c2.ordem = 1 then c2.denominacao else null end)                   curso_tecnico_nome_1,
             max(case when c2.ordem = 2 then c2.cod_curso else null end)                     curso_tecnico_cod_2,
             max(
                     case when c2.ordem = 2 then c2.curso_exigido_ou_desejado else null end) curso_tecnico_exigido_desejado_2,
             max(case when c2.ordem = 2 then c2.denominacao else null end)                   curso_tecnico_nome_2,
             max(case when c2.ordem = 3 then c2.cod_curso else null end)                     curso_tecnico_cod_3,
             max(
                     case when c2.ordem = 3 then c2.curso_exigido_ou_desejado else null end) curso_tecnico_exigido_desejado_3,
             max(case when c2.ordem = 3 then c2.denominacao else null end)                   curso_tecnico_nome_3,
             max(case when c2.ordem = 4 then c2.cod_curso else null end)                     curso_tecnico_cod_4,
             max(
                     case when c2.ordem = 4 then c2.curso_exigido_ou_desejado else null end) curso_tecnico_exigido_desejado_4,
             max(case when c2.ordem = 4 then c2.denominacao else null end)                   curso_tecnico_nome_4,
             max(case when c2.ordem = 5 then c2.cod_curso else null end)                     curso_tecnico_cod_5,
             max(
                     case when c2.ordem = 5 then c2.curso_exigido_ou_desejado else null end) curso_tecnico_exigido_desejado_5,
             max(case when c2.ordem = 5 then c2.denominacao else null end)                   curso_tecnico_nome_5,
             y.cnpj,
             y.razao_social,
             y.logradouro                                                as                  logradouro_company,
             y.numero                                                    as                  numero_logradouro_company,
             y.cep                                                       as                  cep_company,
             y.bairro                                                    as                  bairro_company,
             y.bairro                                                    as                  bairro_companya,
             y.cidade                                                    as                  cidade_company,
             y.cod_state                                                  as                  cod_state_company,
             y.uf                                                        as                  cod_uf_company,
             tge.sigla_estado                                            as                  sigla_uf_company,
             y.nome_contato                                              as                  nome_contato_company,
             y.email                                                     as                  email_company,
             y.telefone_contato                                          as                  telefone_contato_company,
             y.site                                                      as                  site_company,
             CASE
                 WHEN date_part('day',
                                ((x.data_ultima_operacao + interval '1' day * x.prazo) - current_timestamp))::integer between 0 and x.prazo
                     THEN 'ativo'
                 ELSE 'inativo'
                 END                                                     as                  status_vaga,
             x.data_ultima_operacao::timestamp(0) + interval '1' day * x.prazo               data_validade_anuncio,
             TO_CHAR(x.data_cadastro, 'dd/mm/YYYY hh:mi:ss')             AS                  data_cadastro_vaga,
             TO_CHAR(x.data_modificacao, 'dd/mm/YYYY hh:mi:ss')          AS                  data_modificacao_vaga,
             case when x.id is not null then 0 end                       as                  origem
      from ( ( (((((
          company.company_cad_vagas x left join company.company y on (x.cod_company = y.cod_company)
          ) left join (
          select (row_number() over (partition by a.id_cad_vaga order by a.id asc))     as ordem,
                 a.*,
                 o.titulo,
                 (case when a.exigido_desejavel = 0 then 'Não exigido' else t.nome end) as tempo_experiencia_exigido
          from (company.company_cad_vagas_areas_atuacao a left join
              conf.cbo2002_ocupacao o on o.codigo::integer = a.cod_area_atuacao)
                   left join conf.faixa_tempo_trabalho t on t.cod_faixa_tempo_trabalho = a.exigido_desejavel
      ) c on c.id_cad_vaga = x.id ) left join conf.escolaridade e on e.cod_escolaridade = x.cod_escolaridade) left join conf.turno tu on tu.cod_turno = x.cod_turno)
          left join (
              select (row_number() over (partition by a.id_cad_vaga order by a.id asc))     as ordem,
                     a.*,
                     o.denominacao,
                     (case when a.exigido_desejavel = 1 then 'Exigido' else 'Desejado' end) as curso_exigido_ou_desejado
              from (company.company_cad_vagas_ex_cursos a
                       left join
                   conf.cursos_fic o on o.id = a.cod_curso)
          ) c1 on c1.id_cad_vaga = x.id) left join (
          select (row_number() over (partition by a.id_cad_vaga order by a.id asc))     as ordem,
                 a.*,
                 o.nome                                                                 as denominacao,
                 (case when a.exigido_desejavel = 1 then 'Exigido' else 'Desejado' end) as curso_exigido_ou_desejado
          from (company.company_cad_vagas_ex_cursos_tecnicos a
                   left join
               conf.cursos_tecnicos o on o.id = a.cod_curso)
      ) c2 on c2.id_cad_vaga = x.id ) left join conf.tb_geo_municipios tgm on tgm.codigo = x.cod_state )



               left join conf.vw_tb_geo_states tge on tge.cod_uf::text = y.uf
      where y.cod_company is not null
        and y.status = 1
        and x.status = 1
        and y.aprovado = 1
        and (substring(x.cod_state::text, 1, 1)::integer > 0
          or (x.cod_state is null
              or x.cod_state = 0))
        and (
                case
                    when x.status = 0 then false
                    when x.status = 1
                        and current_date < (x.data_cadastro::date + x.prazo::integer) then true
                    when x.status = 1
                        and current_date >= (x.data_cadastro::date + x.prazo::integer) then false
                    end) = true
      group by x.id,
               x.cod_company, x.nome, x.descricao, x.quantidade, tipo,
               (case when x.pcd = true then 'Sim' else 'Não' end),
               x.cod_escolaridade, x.cod_turno, x.salario, x.logradouro, x.numero, x.complemento, x.referencia, x.cep,
               x.cep, x.bairro, tgm.nome, tgm.sigla_estado, x.cod_state, x.data_cadastro::date, x.prazo,
               x.d_alimentacao, x.d_alimentacao, x.d_saude, x.d_transporte, x.d_outros,
               e.nome, tu.nome,
               y.cnpj, y.razao_social, y.nome_fantasia,
               y.logradouro,
               y.numero,
               y.cep,
               y.bairro,
               y.bairro,
               y.cidade,
               y.cod_state,
               y.uf,
               tge.sigla_estado,
               y.nome_contato,
               y.email,
               y.telefone_contato,
               y.site,
               status_vaga,
               data_validade_anuncio,
               x.data_cadastro,
               x.data_modificacao
      union all
      select ve.id,
             replace(ve.company, ';', '-') as                                         company,
             replace(ve.title, ';', '-')   as                                         title,
             (concat(replace(regexp_replace(ve.description, '[ ]+', ' ', 'g'), ';', '-'),
                     replace(regexp_replace(ve.requisitos, '[ ]+', ' ', 'g'), ';', '-'),
                     replace(regexp_replace(ve.beneficios, '[ ]+', ' ', 'g'), ';', '-'),
                     replace(regexp_replace(ve.desejavel, '[ ]+', ' ', 'g'), ';', '-'),
                     replace(regexp_replace(ve.regime, '[ ]+', ' ', 'g'), ';', '-'))) descricao_informacoes_adicionais,
             1                                                                        quantidade_de_vagas,
             ve.tipo                                                                  tipo,
             ''                                                                       vaga_pcd,
             0                                                                        cod_escolaridade,
             0                                                                        cod_turno,
             ve.salario                                                               salario,
             ve.logradouro                                                            endereco,
             ''                                                                       numero_endereco,
             ''                                                                       complemento,
             ''                                                                       referencia,
             ''                                                                       cep,
             ''                                                                       bairro,
             ve.location_city,
             uf.sigla,
             ve.state,
             ve.data_cadastro,
             case
                 when ve.data_expiracao is not null then extract(days
                                                                 from
                                                                 (data_expiracao - data_cadastro))
                 else 9999
                 end                       as                                         validade_do_anuncio,
             null                                                                     auxilio_alimentacao,
             null                                                                     d_alimentacao,
             null                                                                     plano_de_saude,
             null                                                                     auxilio_transporte,
             null                                                                     outros,
             null                                                                     escolaridade_exigida,
             null                                                                     nome_turno,
             null                                                                     cod_cbo_area_atuacao_1,
             null                                                                     descricao_cbo_areatuacao_1,
             null                                                                     cod_tempo_experiencia_exigido_1,
             null                                                                     desc_tempo_experiencia_exigido_1,
             null                                                                     cod_cbo_area_atuacao_2,
             null                                                                     descricao_cbo_areatuacao_2,
             null                                                                     cod_tempo_experiencia_exigido_2,
             null                                                                     desc_tempo_experiencia_exigido_2,
             null                                                                     cod_cbo_area_atuacao_3,
             null                                                                     descricao_cbo_areatuacao_3,
             null                                                                     cod_tempo_experiencia_exigido_3,
             null                                                                     desc_tempo_experiencia_exigido_3,
             null                                                                     cod_cbo_area_atuacao_2,
             null                                                                     descricao_cbo_areatuacao_2,
             null                                                                     cod_tempo_experiencia_exigido_2,
             null                                                                     desc_tempo_experiencia_exigido,
             null                                                                     cod_cbo_area_atuacao,
             null                                                                     descricao_cbo_areatuacao,
             null                                                                     desc_tempo_experiencia_exigido_333,
             null                                                                     curso_complementar_cod_1,
             null                                                                     curso_complementar_exigido_desejado_1,
             null                                                                     curso_complementar_nome_1,
             null                                                                     curso_complementar_cod_2,
             null                                                                     curso_complementar_exigido_desejado_2,
             null                                                                     curso_complementar_nome_2,
             null                                                                     curso_complementar_cod_3,
             null                                                                     curso_complementar_exigido_desejado_3,
             null                                                                     curso_complementar_nome_3,
             null                                                                     curso_complementar_cod_4,
             null                                                                     curso_complementar_exigido_desejado_4,
             null                                                                     curso_complementar_nome_4,
             null                                                                     curso_complementar_cod_5,
             null                                                                     curso_complementar_exigido_desejado_5,
             null                                                                     curso_complementar_nome_5,
             null                                                                     curso_tecnico_cod_1,
             null                                                                     curso_tecnico_exigido_desejado_1,
             null                                                                     curso_tecnico_nome_1,
             null                                                                     curso_tecnico_cod_2,
             null                                                                     curso_tecnico_exigido_desejado_2,
             null                                                                     curso_tecnico_nome_2,
             null                                                                     curso_tecnico_cod_3,
             null                                                                     curso_tecnico_exigido_desejado_3,
             null                                                                     curso_tecnico_nome_3,
             null                                                                     curso_tecnico_cod_4,
             null                                                                     curso_tecnico_exigido_desejado_4,
             null                                                                     curso_tecnico_nome_4,
             null                                                                     curso_tecnico_cod_5,
             null                                                                     curso_tecnico_exigido_desejado_5,
             null                                                                     curso_tecnico_nome_5,
             ve.cnpj                                                                  cnpj,
             ''                                                                       razao_social,
             ''                                                                       logradouro_company,
             ''                                                                       numero_logradouro_company,
             ''                                                                       cep_company,
             ''                                                                       bairro_company,
             ''                                                                       cidade_company,
             ''                                                                       cod_state_company,
             ''                                                                       cod_uf_company,
             0                                                                        sigla_uf_company,
             ''                                                                       nome_contato_company,
             ''                                                                       email_company,
             ''                                                                       telefone_contato_company,
             ''                                                                       site_company,
             case
                 when ve.status = 0 then 'inativo'
                 when ve.status = 1 then 'ativo'
                 end                       as                                         status_vagas,
             case
                 when ve.data_expiracao is not null then ve.data_expiracao::text
                 else ''
                 end                       as                                         data_validade_anuncio,
             case
                 when ve.data_cadastro is not null then ve.data_cadastro::text
                 else ''
                 end                       as                                         data_cadastro_vaga,
             now()                                                                    data_modificacao_vaga,
             ''                                                                       col87,
             ''                                                                       col88,
             ve.origem
      from (
               select distinct on
                   (x.id) id,
                          x.constante
               from profissional.vagas_externas x
               where 1 = 1
                 and ((substring(x.state::text, 1, 1)::integer > 0))
                 and date_trunc('minute', x.data_cadastro::timestamp(0)) in (
                   select distinct on
                       ( ve.data_cadastro::date ) date_trunc('minute', data_cadastro::timestamp(0))
                   from profissional.vagas_externas ve
                   order by ve.data_cadastro::date asc,
                            ve.constante desc)
                 and ((substring(x.state::text, 1, 1)::integer > 0))
           ) x
               left join profissional.vagas_externas ve on
              ve.constante = x.constante
               left join conf.tb_geo_states uf on
              uf.codigo::text = substring(ve.state::text, 1, 2)
      where 1 = 1
     ) t;​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...