на моей машине 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[
конструкцией, поэтому может быть подсказка