Hãy thử unnest()/trừ:
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
Và các nhà điều hành đặc biệt intarray:
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
cơ bản:
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
Thời gian cho mỗi giao lộ mảng:
intarray - : 0.4 µs
unnest()/intersect : 13.4 µs
Tất nhiên cách intarray là nhanh hơn nhiều, nhưng tôi thấy nó tuyệt vời mà postgres có thể hạ gục một subquery phụ thuộc (trong đó có chứa một hash và các công cụ khác) trong 13,4 ms ...
Trình tự của mảng sản xuất khác nhau kết quả ở đây: chọn mảng (chọn không cần thiết (ARRAY ['1']) ngoại trừ chọn không cần thiết (ARRAY ['1', '2'])) trả về danh sách trống nhưng chọn mảng (chọn không cần thiết (ARRAY ['1', '2 ']) ngoại trừ chọn không cần thiết (ARRAY [' 1 '])) trả về {2}. – Brady
@ Brady: vì nó phải không? '{1} - {1,2} = {}', '{1,2} - {1} = {2}'. –
Chỉ cần nhấn mạnh rằng hàm này không ổn định, thứ tự trong ': arr1' không được giữ nguyên. Cảm ơn bạn đã chia sẻ một lớp lót này. – jlandercy