Наиболее эффективная запись массива в PostgreSQL - PullRequest
0 голосов
/ 14 мая 2018

Использование массивов как констант, что является более эффективным:

array[1,2,3]

или

'{1,2,3}'::int[]`

?

Или, что более сложно:

array['1812-01-01'::date, '1812-02-02'] 

или

'{1812-01-01,1812-02-02}'::date[]

?

Я действительно боюсь окунуться в источники PostgreSQL, несмотря на то, что это замечательно.

Обновление

Частичный ответ, основанный на исследовании, предоставленном @VaoTsun (большое спасибо!) Удивительно, но '{1,2,3}'::int[] быстрее, чем array[1,2,3].Dixi!

1 Ответ

0 голосов
/ 14 мая 2018

на моей машине array[] всегда немного медленнее, чем '{}' one:

so=# do $$
declare
 t text;
 ts timestamptz;
begin
 for n in 1..10 loop
  select clock_timestamp() into ts;
  for i in 1..99999 loop
   execute format($f$select array['18%s-01-01'::date, '18%s-02-02']$f$,i,i) into t;
  end loop;
  raise info '%', t||' "[" '||clock_timestamp() - ts;

  select clock_timestamp() into ts;
  for i in 1..99999 loop
   execute format($f$select '{18%s-01-01,18%s-02-02}'::date[]$f$,i,i) into t;
  end loop;
  raise info '%', t||' "{" '||clock_timestamp() - ts;
 end loop;
end; $$;
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:01.99259
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.691473
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:02.207583
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.762358
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:01.926091
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.685358
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:01.98542
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.686831
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:02.01972
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.698365
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:02.008609
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.698494
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:01.987951
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.698711
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:01.977347
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.707921
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:01.945438
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.663771
INFO:  {1899999-01-01,1899999-02-02} "[" 00:00:02.079186
INFO:  {1899999-01-01,1899999-02-02} "{" 00:00:01.752366
DO
Time: 37178.056 ms

Неявно документы предлагают "вьющийся" способ ввода массивов в первой строке:

https://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-INPUT

Чтобы записать значение массива в виде литеральной константы, заключите значения элементов в фигурные скобки и разделите их запятыми.

и более поздних версий: https://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX-ARRAY-CONSTRUCTORS

Конструктор массива - это выражение, которое создает значение массива, используя значения для его элементов-членов.

Таким образом, можно ожидать, что построение фигурных значений из конструкции массива займетдополнительная галочкаНо, конечно, я просто размышляю здесь.Ответ был предназначен только для измерения линейного воздействия обоих способов, смешанных во времени на ненагруженном компьютере ...

Также IN (scalar list) переписывается в = ANY(array) конструкцию в "фигурном" формате:

so=# explain analyse select * from pg_database where datname in ('t','so');
                                              QUERY PLAN
-------------------------------------------------------------------------------------------------------
 Seq Scan on pg_database  (cost=0.00..1.02 rows=2 width=254) (actual time=0.105..0.109 rows=2 loops=1)
   Filter: (datname = ANY ('{t,so}'::name[]))

Я не говорю, что это подразумевает, что это то же самое, но это выглядит внутренне выбранным по сравнению с array[ конструкцией, поэтому может быть подсказка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...