sql >> Databáze >  >> RDS >> PostgreSQL

Paralelní unnest() a pořadí řazení v PostgreSQL

Ano, to je vlastnost Postgresu a paralelní rozkládání je zaručeno být v synchronizaci (pokud všechna pole mají stejný počet prvků).
Postgres 9.4 přidává čisté řešení pro paralelní unnest:

  • Uvolněte paralelně několik polí

Pořadí výsledných řádků však není zaručeno. Vlastně s tak jednoduchým prohlášením jako:

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

výsledné pořadí řádků je "zaručené", ale Postgres nic netvrdí. Optimalizátor dotazů může volně objednávat řádky, jak uzná za vhodné, pokud pořadí není explicitně definováno. To může mít vedlejší účinky u složitějších dotazů.

Pokud je druhý dotaz ve vaší otázce to, co skutečně chcete (přidat indexové číslo k nevnořeným prvkům pole), existuje lepší způsob s generate_subscripts() :

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

Podrobnosti v této související odpovědi:

  • Jak získat přístup k internímu indexu pole pomocí postgreSQL?

Bude vás zajímat WITH ORDINALITY v Postgres 9.4 :

  • PostgreSQL unnest() s číslem prvku

Pak můžete použít:

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


  1. Uživatelské heslo hosta v 11i/R12

  2. The Adaptive Join Threshold

  3. Přidání nové hodnoty k existujícímu typu ENUM

  4. Jak UPSERTovat (SPOUČIT, VLOŽIT... PŘI DUPLIKÁTNÍ AKTUALIZACI) v PostgreSQL?