sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnera tabelltyp från en funktion i PostgreSQL

Din funktion gör mycket av tomt arbete.

Du kan förenkla med en FOR loop med implicit markör istället för den mer tråkiga och dyra explicita markören.
Vid en närmare titt visar det sig att du inte behöver något av detta alls. Förenkla radikalt med en enkel fråga. Jag slog in den i en SQL-funktion:

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;

Bör vara mycket snabbare samtidigt som du returnerar densamma.
Använd även detta:

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

istället för:

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

Alternativet är sargable och kan använda ett vanligt index på entry_time , vilket borde vara avgörande för prestanda.



  1. Hur man ändrar tabell i SQL Server genom att använda Alter Statement - SQL Server / T-SQL självstudie del 35

  2. Hur kan jag få en lista över elementnamn från ett XML-värde i SQL Server

  3. AMD EPYC 7002-seriens processorer och SQL Server

  4. Docker väntar på att postgresql ska köras