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