Postgresql為什麼 intarray 的 push
為什麼 intarray 的 push +
比數組到元素連接 ||
快得多?
在使用整數數組時,我總是預設使用
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
.