it-swarm.com.de

Postgres FÜR SCHLEIFE

Ich versuche, 25 zufällige Stichproben von 15.000 IDs aus einer Tabelle zu erhalten. Anstatt jedes Mal manuell auf "Ausführen" zu drücken, versuche ich, eine Schleife zu erstellen. Was ich voll und ganz verstehe, ist nicht die optimale Nutzung von Postgres, aber es ist das Werkzeug, das ich habe. Das habe ich bisher:

for i in 1..25 LOOP
   insert into playtime.meta_random_sample
   select i, ID
   from   tbl
   order  by random() limit 15000
end loop
45
user2840106

Prozedurale Elemente wie Schleifen sind nicht Teil von der SQL-Sprache und kann nur innerhalb des Körpers einer prozeduralen Sprache verwendet werden Funktion , Prozedur (Postgres 11 oder später) oder ein DO Anweisung, wenn solche zusätzlichen Elemente durch die jeweilige Verfahrenssprache definiert sind. Die Standardeinstellung ist PL/pgSQL , aber es gibt andere .

Beispiel mit 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$;

Für viele Aufgaben, die mit einer Schleife gelöst werden können, gibt es eine kürzere und schnellere satzbasierte Lösung um die Ecke. Pure SQL-Entsprechung für Ihr Beispiel:

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;

Über generate_series() :

Informationen zum Optimieren der Leistung von zufälligen Auswahlen:

108

Unten sehen Sie ein Beispiel, das Sie verwenden können:

create temp table test2 (
  id1  numeric,
  id2  numeric,
  id3  numeric,
  id4  numeric,
  id5  numeric,
  id6  numeric,
  id7  numeric,
  id8  numeric,
  id9  numeric,
  id10 numeric) 
with (oids = false);

do
$do$
declare
     i int;
begin
for  i in 1..100000
loop
    insert into test2  values (random(), i * random(), i / random(), i + random(), i * random(), i / random(), i + random(), i * random(), i / random(), i + random());
end loop;
end;
$do$;
0
Gabriel