PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Restituisci il tipo di tabella da una funzione in PostgreSQL

La tua funzione sta facendo molto di lavoro vuoto.

Potresti semplificare con un FOR ciclo con cursore implicito invece del più noioso e costoso cursore esplicito.
A un'occhiata più da vicino risulta che non hai bisogno di nulla di tutto ciò. Semplificare radicalmente con una semplice domanda. L'ho avvolto in una funzione SQL:

CREATE OR REPLACE FUNCTION ccdb.fn_email_details_auto()
  RETURNS TABLE (code integer, area smallint, action smallint, flag smallint
               , ucount integer, view_cnt integer) AS
$func$

SELECT u.section_code, u.ddu_area, u.ddu_action, u.status_flag
     , u.ccdb_ucount, u.ccdb_view_cnt
FROM   ccdb.update_qtable u
WHERE  u.entry_time >= now()::date - 1
AND    u.entry_time <  now()::date        -- sargable!
ORDER  BY u.section_code, u.ddu_area, u.ddu_action;

$func$  LANGUAGE sql;

Dovrebbe essere molto più veloce restituendo lo stesso.
Inoltre, usa questo:

WHERE  u.entry_time >= now()::date - 1
AND    u.entry_time <  now()::date

invece di:

WHERE entry_time::date = now()::date - interval '1 day'

L'alternativa è sargable e può utilizzare un semplice indice su entry_time , che dovrebbe essere fondamentale per le prestazioni.