PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Предайте множество набори или масиви от стойности към функция

Можете да постигнете това с проста SQL функция. Ключова характеристика е функцията generate_subscripts() :

CREATE OR REPLACE FUNCTION f_attendance(_arr2d int[])
  RETURNS SETOF attendance AS
$func$
   SELECT a.*
   FROM   generate_subscripts($1, 1) i
   JOIN   attendance a ON a.class   = $1[i][1]
                      AND a.section = $1[i][2]
$func$  LANGUAGE ROWS 10 sql STABLE;

Обадете се:

SELECT * FROM f_attendance(ARRAY[[1,1],[2,2]]);

Или същото с масив literal - което е по-удобно в някои контексти, особено с подготвени изявления:

SELECT * FROM f_attendance('{{1,1},{2,2}}');

Функцията винаги очаква 2D масив. Дори и да преминете един чифт, вложете го:

SELECT * FROM f_attendance('{{1,1}}');

Одит на внедряването ви

  1. Направихте функцията VOLATILE , но може да бъде STABLE . По документация:

    Поради това поведение на моментна снимка, функция, съдържаща само SELECT командите могат безопасно да бъдат маркирани STABLE .

    Свързано:

    • Как да предам параметър във функция за дата
  2. Вие също използвате LANGUAGE plpgsql вместо sql , което има смисъл, ако изпълнявате функцията няколко пъти в една и съща сесия. Но тогава трябва също да го направите STABLE или губите тази потенциална полза от производителността. Още веднъж ръководството:

    STABLE и IMMUTABLE функциите използват моментна снимка, установена към началото на извикващата заявка, докато функциите VOLATILE получават прясна снимка в началото на всяка заявка, която изпълняват.

  3. Вашето EXPLAIN изходът показва Сканиране само с индекс , а не последователно сканиране, както подозирате в коментара си.

  4. Във вашия EXPLAIN има и стъпка за сортиране изход, който не съвпада с кода, който показвате. Сигурни ли сте, че сте копирали правилния EXPLAIN изход? Как изобщо го получи? Функциите на PL/pgSQL са черни кутии за EXPLAIN . Използвахте ли auto_explain ? Подробности:

    • План на заявка Postgres на извикване на UDF, написано в pgpsql
  5. Инструментът за планиране на заявки в Postgres няма представа колко елемента на масива ще има предаденият параметър, така че е трудно да се планира заявката и може по подразбиране да се извършва последователно сканиране (в зависимост от повече фактори). Можете да помогнете, като декларирате очаквания брой редове. Ако обикновено нямате повече от 10 елемента, добавете ROWS 10 както направих сега по-горе. И тествайте отново.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Открийте дали редът е актуализиран или вмъкнат

  2. Как да върна само работно време от резервации в PostgreSql?

  3. Преглед на инструментите за диаграма на базата данни, налични за PostgreSQL

  4. Определяне на OID на таблица в Postgres 9.1?

  5. Как да актуализирате групово последователност ID postgreSQL за всички таблици