PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Parallele Unnest() und Sortierreihenfolge in PostgreSQL

Ja, das ist eine Funktion von Postgres und das parallele Entschachteln ist garantiert synchron zu sein (solange alle Arrays die gleiche Anzahl von Elementen haben).
Postgres 9.4 fügt eine saubere Lösung für die parallele Entschachtelung hinzu:

  • Entschachteln Sie mehrere Arrays parallel

Die Reihenfolge der resultierenden Zeilen ist jedoch nicht garantiert. Eigentlich mit einer so einfachen Anweisung wie:

SELECT unnest(ARRAY[5,3,9]) AS id

Die resultierende Reihenfolge der Zeilen ist "garantiert", aber Postgres behauptet nichts. Dem Abfrageoptimierer steht es frei, Zeilen nach eigenem Ermessen anzuordnen, solange die Reihenfolge nicht explizit definiert ist. Dies kann bei komplexeren Abfragen Nebenwirkungen haben.

Wenn die zweite Abfrage in Ihrer Frage das ist, was Sie tatsächlich wollen (eine Indexnummer zu nicht verschachtelten Array-Elementen hinzufügen), gibt es mit generate_subscripts() einen besseren Weg :

SELECT unnest(ARRAY[5,3,9]) AS id
     , generate_subscripts(ARRAY[5,3,9], 1) AS idx
ORDER  BY idx;

Details in dieser verwandten Antwort:

  • Wie greife ich mit PostgreSQL auf den internen Index des Arrays zu?

WITH ORDINALITY wird Sie interessieren in Postgres 9.4 :

  • PostgreSQL unnest() mit Elementnummer

Dann können Sie verwenden:

SELECT * FROM unnest(ARRAY[5,3,9]) WITH ORDINALITY tbl(id, idx);