sql >> Database >  >> RDS >> PostgreSQL

Tabeltype retourneren van een functie in PostgreSQL

Je functie doet veel leeg werk.

Je zou kunnen vereenvoudigen met een FOR loop met impliciete cursor in plaats van de meer vervelende en dure expliciete cursor.
Bij nader inzien blijkt dat je dit helemaal niet nodig hebt. radicaal vereenvoudigen met een simpele vraag. Ik heb het verpakt in een SQL-functie:

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;

Moet veel zijn sneller terwijl u hetzelfde retourneert.
Gebruik ook dit:

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

in plaats van:

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

Het alternatief is sargable en kan een gewone index gebruiken op entry_time , wat cruciaal zou moeten zijn voor de prestaties.



  1. MariaDB JSON_TABLE() uitgelegd

  2. Prestatieverrassingen en aannames:DATEDIFF

  3. Beslis tussen controle op basis van agenten of controle zonder agenten

  4. Kopieer sqlite in Android Studio-items werkt niet