Boa tarde a todos,

    Tenho a consulta abaixo que quando executada retorna rapidamente os 
registros, porém ao colocá-la em uma função a mesma demora uma 
eternidade para ser executada, cheguei ao ponto de deixar rodando por 40 
minutos e não ter o resultado. Cheguei a colocar um Raise logo no início 
do Loop, porém não chegou nem a esse ponto.
    Estou colocando abaixo a consulta, se explain e também a função.

    Agradeço antecipadamente a todos.

"Explain select distinct(mat.id)
    from pontos pon
    join materiaisos mat on pon.cidade = mat.codigocidade
    and pon.codempresa = mat.codempresa and pon.contrato = 
mat.numerocontrato
    left join (
    select ord.cidade, ord.codempresa, ord.codigocontrato
    from ordemservico ord
    where ord.cidade = 846031 and ord.situacao <> 3
    ) as pendente on mat.codigocidade = pendente.cidade
    and mat.codempresa = pendente.codempresa
    and mat.numerocontrato = pendente.codigocontrato
    join (
    select mat.codigocidade, mat.codempresa, mat.conversoroudecodificador
    from pontos pon
    join materiaisos mat on pon.cidade = mat.codigocidade
    and pon.codempresa = mat.codempresa and pon.contrato = 
mat.numerocontrato
    where pon.cidade = 846031 and pon.situacaodoponto = 1
    and mat.d_dataretirada is null
    ) as okey on okey.codigocidade = pon.cidade
    and okey.codempresa = pon.codempresa
    and okey.conversoroudecodificador = mat.conversoroudecodificador
    where pon.cidade = 846031 and pon.situacaodoponto = 2
    and mat.d_dataretirada is null
    and pendente.cidade is null
"

-- Resultado do Explain
"Unique  (cost=42874.88..42874.88 rows=1 width=8)"
"  ->  Sort  (cost=42874.88..42874.88 rows=1 width=8)"
"        Sort Key: mat.id"
"        ->  Nested Loop Left Join  (cost=31942.63..42874.87 rows=1 
width=8)"
"              Filter: (ord.cidade IS NULL)"
"              ->  Hash Join  (cost=31942.63..36136.00 rows=1102 width=20)"
"                    Hash Cond: ((pon.codempresa = mat.codempresa) AND 
(pon.contrato = mat.numerocontrato))"
"                    ->  Bitmap Heap Scan on pontos pon  
(cost=137.17..3293.21 rows=3479 width=12)"
"                          Recheck Cond: (cidade = 846031)"
"                          Filter: (situacaodoponto = 2)"
"                          ->  Bitmap Index Scan on pon_fk_contrato  
(cost=0.00..136.30 rows=6403 width=0)"
"                                Index Cond: (cidade = 846031)"
"                    ->  Hash  (cost=31676.06..31676.06 rows=8627 width=32)"
"                          ->  Merge Join  (cost=31273.53..31676.06 
rows=8627 width=32)"
"                                Merge Cond: ((pon.codempresa = 
mat.codempresa) AND ("outer"."?column5?" = "inner"."?column6?"))"
"                                ->  Sort  (cost=17599.50..17609.71 
rows=4087 width=25)"
"                                      Sort Key: mat.codempresa, 
(mat.conversoroudecodificador)::text"
"                                      ->  Merge Join  
(cost=17005.93..17354.34 rows=4087 width=25)"
"                                            Merge Cond: 
((pon.codempresa = mat.codempresa) AND (pon.contrato = mat.numerocontrato))"
"                                            ->  Sort  
(cost=3461.41..3468.72 rows=2924 width=12)"
"                                                  Sort Key: 
pon.codempresa, pon.contrato"
"                                                  ->  Bitmap Heap Scan 
on pontos pon  (cost=137.03..3293.07 rows=2924 width=12)"
"                                                        Recheck Cond: 
(cidade = 846031)"
"                                                        Filter: 
(situacaodoponto = 1)"
"                                                        ->  Bitmap 
Index Scan on pon_fk_contrato  (cost=0.00..136.30 rows=6403 width=0)"
"                                                              Index 
Cond: (cidade = 846031)"
"                                            ->  Sort  
(cost=13544.53..13639.73 rows=38081 width=25)"
"                                                  Sort Key: 
mat.codempresa, mat.numerocontrato"
"                                                  ->  Bitmap Heap Scan 
on materiaisos mat  (cost=861.28..9733.68 rows=38081 width=25)"
"                                                        Recheck Cond: 
(codigocidade = 846031)"
"                                                        Filter: 
(d_dataretirada IS NULL)"
"                                                        ->  Bitmap 
Index Scan on mat_fk_contrato  (cost=0.00..851.76 rows=40992 width=0)"
"                                                              Index 
Cond: (codigocidade = 846031)"
"                                ->  Sort  (cost=13674.03..13769.23 
rows=38081 width=33)"
"                                      Sort Key: mat.codempresa, 
(mat.conversoroudecodificador)::text"
"                                      ->  Bitmap Heap Scan on 
materiaisos mat  (cost=861.28..9733.68 rows=38081 width=33)"
"                                            Recheck Cond: (846031 = 
codigocidade)"
"                                            Filter: (d_dataretirada IS 
NULL)"
"                                            ->  Bitmap Index Scan on 
mat_fk_contrato  (cost=0.00..851.76 rows=40992 width=0)"
"                                                  Index Cond: (846031 = 
codigocidade)"
"              ->  Index Scan using ord_ordemcidadecontrato on 
ordemservico ord  (cost=0.00..6.10 rows=1 width=12)"
"                    Index Cond: ((ord.cidade = 846031) AND 
(mat.codempresa = ord.codempresa) AND (mat.numerocontrato = 
ord.codigocontrato))"
"                    Filter: (situacao <> 3)"

-- Função com a consulta
CREATE OR REPLACE FUNCTION 
"public"."func_verificaequipamentos"(par_cidade integer,
par_dataretirada date, par_limite integer)
RETURNS void AS
$body$
DECLARE
    reg_material record;
    reg_exec record;
    var_id text default null;
    var_update text;
BEGIN
    for reg_material in select mat.id
    from pontos pon
    join materiaisos mat on pon.cidade = mat.codigocidade
    and pon.codempresa = mat.codempresa and pon.contrato = 
mat.numerocontrato
    left join (
    select ord.cidade, ord.codempresa, ord.codigocontrato
    from ordemservico ord
    where ord.cidade = par_cidade and ord.situacao <> 3
    ) as pendente on mat.codigocidade = pendente.cidade
    and mat.codempresa = pendente.codempresa
    and mat.numerocontrato = pendente.codigocontrato
    join (
    select mat.codigocidade, mat.codempresa, mat.conversoroudecodificador
    from pontos pon
    join materiaisos mat on pon.cidade = mat.codigocidade
    and pon.codempresa = mat.codempresa and pon.contrato = 
mat.numerocontrato
    where pon.cidade = par_cidade and pon.situacaodoponto = 1
    and mat.d_dataretirada is null
    ) as okey on okey.codigocidade = pon.cidade
    and okey.codempresa = pon.codempresa
    and okey.conversoroudecodificador = mat.conversoroudecodificador
    where pon.cidade = par_cidade and pon.situacaodoponto = 2
    and mat.d_dataretirada is null
    and pendente.cidade is null limit par_limite
    loop
      if var_id is null then
        var_id := reg_material.id;
      else
        var_id := var_id ||','|| reg_material.id;
      end if;
    end loop;
   
    if var_id is not null then
      var_update := 'update materiaisos set d_dataretirada = 
'''||par_dataretirada ||
                    ''' where id in ('|| var_id ||');';
      execute var_update;
    end if;
   
    return;
END;
$body$

Att,

-- 
=================================
Hilton S. Pereira
Analista de Sistemas
Interfocus Tecnologia
=================================

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a