Postgresql

為什麼 intarray 的 push + 比數組到元素連接 || 快得多?

  • May 15, 2017

在使用整數數組時,我總是預設使用intarray. 但是,現在我想知道為什麼預設連接要慢得多。

這個答案可能需要對內部結構有所了解。在內部,intarray的電話intarray_push_elem||電話array_append

樣本數據

CREATE EXTENSION intarray;
CREATE TABLE foo AS
 SELECT ARRAY[x::int] AS bar
 FROM generate_series(1,1e7)
   AS gs(x);

結果相同

SELECT ARRAY[1] + 42 = ARRAY[1] || 42;
?column? 
----------
t
(1 row)

||

EXPLAIN ANALYZE
 SELECT bar || 42 FROM foo;

                                                   QUERY PLAN                                                     
-------------------------------------------------------------------------------------------------------------------
Seq Scan on foo  (cost=0.00..198528.55 rows=9999884 width=25) (actual time=0.029..5193.752 rows=10000000 loops=1)
Planning time: 0.051 ms
Execution time: 5679.489 ms
(3 rows)

從擴展+intarray

EXPLAIN ANALYZE
 SELECT bar + 42 FROM foo;
                                                   QUERY PLAN                                                     
-------------------------------------------------------------------------------------------------------------------
Seq Scan on foo  (cost=0.00..198528.55 rows=9999884 width=25) (actual time=0.026..2066.786 rows=10000000 loops=1)
Planning time: 0.052 ms
Execution time: 2388.462 ms
(3 rows)

正常intarray+||. 為什麼||這麼慢?

似乎||對多維數組做了更多的事情。

例如,||遇到以下情況

SELECT ARRAY[ARRAY[1]] || 5;
ERROR:  argument must be empty or one-dimensional array

然而,隨著+陣列被展平..

SELECT ARRAY[ARRAY[1]] + 5;
?column? 
----------
{1,5}
(1 row)

此外,似乎 intarray不處理nulls 。

SELECT ARRAY[null]::int[] + 5;
ERROR:  array must not contain nulls

它似乎也||使用PG_RETURN_DATUM而不是通過引用傳遞,這似乎是+PG_RETURN_POINTER.

引用自:https://dba.stackexchange.com/questions/173625