arrays - 确保通过合并 2 个 bigint 数组创建的数组中的唯一元素
问题描述
bigint
确保通过合并其他 2个数组创建的数组中值的唯一性的最有效方法是什么bigint
?
例如,这个操作select ARRAY[1,2] || ARRAY[2, 3]
应该给出一个结果1,2,3
。我检查了扩展名intarray
,发现它不适用于bigint
.
解决方案
既然您要求高效-可以优化该功能:
您的问题中没有任何内容需要排序输出。所以:
CREATE OR REPLACE FUNCTION f_merge_uniq(bigint[], bigint[])
RETURNS bigint[] AS
$func$
SELECT ARRAY(
SELECT unnest($1)
UNION
SELECT unnest($2)
)
$func$ LANGUAGE sql IMMUTABLE;
但是你也可以在几乎不增加成本的情况下对其进行排序:
CREATE OR REPLACE FUNCTION f_merge_uniq_sort(bigint[], bigint[])
RETURNS bigint[] AS
$func$
SELECT ARRAY(
SELECT DISTINCT x
FROM (
SELECT unnest($1)
UNION ALL
SELECT unnest($2)
) sub(x)
ORDER BY 1
)
$func$ LANGUAGE sql IMMUTABLE;
db<>在这里摆弄
由于多种原因,计划和执行速度接近两倍:
如果你
UNION
以后,ORDER BY
Postgres 会做额外的工作。使用 ( ) 对每个结果行进行排序array_agg(x order by x)
是最坏的情况。仅一个结果行(如本例中)甚至更慢,因为开销更大。在子查询中排序(如果可能)通常更有效:该
DISTINCT
操作可以立即基于排序。我的第二个函数f_merge_uniq_sort()
实现了这一点,因此它实际上与第一个函数一样快,f_merge_uniq()
即使它返回已排序的数组。(在我使用 Postgres 12 的测试中似乎更快一点!似乎UNION
效率略低于DISTINCT
.)构造
ARRAY
函数比.array_agg()
推荐阅读
- r - 使用 R ggplot 绘制宽格式数据
- c# - Sprites 自动定位和缩放
- ruby-on-rails - RubyMine 停止按钮在 Rails 应用程序中创建僵尸 Puma 服务器
- swift - 自动从 Firebase 数据库中删除数据
- java - 初始化二维数组
- node.js - Shopify API - 获取所有产品(60k 产品)请求超时或套接字挂断
- javascript - 隐藏可见区域之外的项目
- python - 如何使用 csv 模块计算出现次数并计算评分?
- javascript - Dialogflow 在没有用户意图的情况下发送消息
- c - 如何求解 4 个变量的方程