Pessoal,

Preciso de uma ajuda com CURSOR usando plpgsql.

Tenho uma funcao que em um determinado momento abre um cursor do seguinte
modo:

 DECLARE
     ...
     ...
        -- Cursor que representa os dados da query
        c_periodo refcursor;

BEGIN

        OPEN c_periodo FOR SELECT d.dadtdt_pacote,
d.dadtmotooid,d.dadtveioid,v.veiplaca
                        FROM dados_telemetria d
                        LEFT JOIN veiculo v ON d.dadtveioid = v.veioid AND
(v.veifilioid = _filial OR _filial = 0)
                        WHERE d.dadtdt_pacote >= (_data_inicio - interval
'1 day')
                        AND d.dadtdt_pacote <= (_data_fim + interval '1
day')
                        AND (d.dadtveioid = _veiculo OR _veiculo = 0)
                        AND ((d.dadtmotooid = _motorista OR d.dadtmotooid =
0) OR _motorista IS NULL)
                        AND d.dadtveioid IN
                            (SELECT DISTINCT delveioid FROM delta WHERE
                                deldatapacote >= (_data_inicio - interval
'1 day')
                                AND deldatapacote <= (_data_fim + interval
'1 day')
                                AND delmotooid = _motorista
                            )
                        ORDER BY d.dadtdt_pacote;

            -- Obtendo a primeira linha da query
            FETCH c_periodo INTO dt_pacote,id_motorista,id_veiculo,placa;

            -- Iteracaoo geral
            WHILE FOUND LOOP
             ...
                 WHILE v_logado = id_motorista LOOP
                 ...
                -- Verificando se ha um motorista logado
                IF id_motorista <> 0 THEN
                    -- Retorna o oid do motorista
                    v_retorno.motooid := id_motorista;
                ELSE
                    -- Retorna -1 indicando que nao havia nenhum motorista
logado
                    v_retorno.motooid := -1;
                END IF;

                RAISE NOTICE 'next 1 -->';
                -- Obtendo o proximo item do cursor
                FETCH NEXT FROM c_periodo INTO
dt_pacote,id_motorista,id_veiculo,placa;   --- acho que o cursor foi usado
por causa dessa parte

                -- Fim da iteracao nos eventos
                 END LOOP;
             ...
            END LOOP;
....

O problema esta na hora do "FETCH. Se eu coloco o periodo de 2 dias (500
regs) na query a parada funciona em 10 segs.
Se colocar o periodo de 1 semana (aproximadamente 1600 regs) demora uma
eternidad, tipo, fiquei esperando mais de 5 min. e nada de retorno.

Alguem poderia me dizer se esta sendo feito de errado baseado no que passei
acima?

Seria alguma coisa em configuracao do postgresql com o server linux que
esta estorando a memoria ou coisa do tipo que ta enroscando?

Isso foi feito por um programador que nao trabalha mais aqui, entao, na
verdade e nem sei se um cursor seria o mais indicado.

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

Responder a