Probemos el UNNEST()/excepto:
EXPLAIN ANALYZE SELECT array(select unnest(ARRAY[1,2,3,n]) EXCEPT SELECT unnest(ARRAY[2,3,4,n])) FROM generate_series(1,10000) n;
Function Scan on generate_series n (cost=0.00..62.50 rows=1000 width=4) (actual time=1.373..140.969 rows=10000 loops=1)
SubPlan 1
-> HashSetOp Except (cost=0.00..0.05 rows=1 width=0) (actual time=0.011..0.011 rows=1 loops=10000)
-> Append (cost=0.00..0.04 rows=2 width=0) (actual time=0.002..0.008 rows=8 loops=10000)
-> Subquery Scan "*SELECT* 1" (cost=0.00..0.02 rows=1 width=0) (actual time=0.002..0.003 rows=4 loops=10000)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.002 rows=4 loops=10000)
-> Subquery Scan "*SELECT* 2" (cost=0.00..0.02 rows=1 width=0) (actual time=0.001..0.003 rows=4 loops=10000)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.002 rows=4 loops=10000)
Total runtime: 142.531 ms
Y el intArray operador especial:
EXPLAIN ANALYZE SELECT ARRAY[1,2,3,n] - ARRAY[2,3,4,n] FROM generate_series(1,10000) n;
Function Scan on generate_series n (cost=0.00..15.00 rows=1000 width=4) (actual time=1.338..11.381 rows=10000 loops=1)
Total runtime: 12.306 ms
Línea de base:
EXPLAIN ANALYZE SELECT ARRAY[1,2,3,n], ARRAY[2,3,4,n] FROM generate_series(1,10000) n;
Function Scan on generate_series n (cost=0.00..12.50 rows=1000 width=4) (actual time=1.357..7.139 rows=10000 loops=1)
Total runtime: 8.071 ms
Tiempo por conjunto de intersección:
intarray - : 0.4 µs
unnest()/intersect : 13.4 µs
supuesto, la forma intArray es mucho más rápido, pero me resulta sorprendente que Postgres pueden zap una subconsulta dependientes (que contiene un hash y otras cosas) en 13,4 mu s ...
El orden de las matrices produce diferentes resultados aquí: seleccionar matriz (seleccionar unnest (ARRAY ['1']) excepto seleccionar unnest (ARRAY ['1', '2'])) devuelve lista vacía pero seleccionar matriz (seleccionar unnest (ARRAY ['1', '2 ']) excepto select unnest (ARRAY [' 1 '])) devuelve {2}. – Brady
@ Brady: como debería, ¿no? '{1} - {1,2} = {}', '{1,2} - {1} = {2}'. –
Solo para resaltar que esta función no es estable, el orden en ': arr1' no se conserva. Gracias por compartir este one-liner. – jlandercy