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

Postgres PER LOOP

Procedurale elementi come loop non fanno parte del linguaggio SQL e possono essere utilizzati solo all'interno del corpo di una funzione del linguaggio procedurale, una procedura (Postgres 11 o successivo) o un DO dichiarazione, laddove tali elementi aggiuntivi siano definiti dal rispettivo linguaggio procedurale. L'impostazione predefinita è PL/pgSQL, ma ce ne sono altri.

Esempio con plpgsql:

DO
$do$
BEGIN 
   FOR i IN 1..25 LOOP
      INSERT INTO playtime.meta_random_sample
         (col_i, col_id)                       -- declare target columns!
      SELECT  i,     id
      FROM   tbl
      ORDER  BY random()
      LIMIT  15000;
   END LOOP;
END
$do$;

Per molte attività che possono essere risolte con un ciclo, esiste un set-based più breve e veloce soluzione dietro l'angolo. Equivalente SQL puro per il tuo esempio:

INSERT INTO playtime.meta_random_sample (col_i, col_id)
SELECT t.*
FROM   generate_series(1,25) i
CROSS  JOIN LATERAL (
   SELECT i, id
   FROM   tbl
   ORDER  BY random()
   LIMIT  15000
   ) t;

Informazioni su generate_series() :

  • Qual ​​è il comportamento previsto per più funzioni di restituzione di set nella clausola SELECT?

Informazioni sull'ottimizzazione delle prestazioni delle selezioni casuali:

  • Il modo migliore per selezionare righe casuali PostgreSQL