gpt4 book ai didi

sql - PostgreSQL 中的并行 unnest() 和排序顺序

转载 作者:行者123 更新时间:2023-11-29 11:24:12 27 4
gpt4 key购买 nike

我明白使用

SELECT unnest(ARRAY[5,3,9]) as id

如果没有 ORDER BY 子句,则无法保证结果集的顺序。例如,我可以得到:

id
--
3
5
9

但是下面的请求呢:

SELECT
unnest(ARRAY[5,3,9]) as id,
unnest(ARRAY(select generate_series(1, array_length(ARRAY[5,3,9], 1)))) as idx
ORDER BY idx ASC

是否保证 2 个 unnest() 调用(具有相同的长度)将并行展开并且索引 idx 确实与数组中的项目?

我正在使用 PostgreSQL 9.3.3。

最佳答案

是的,这是 Postgres 的一个特性,并行取消嵌套保证是同步的(只要所有数组都具有相同数量的元素)。
Postgres 9.4 为并行 unnest 添加了一个干净的解决方案:

但是,不能保证结果行的顺序。实际上,用一个简单的语句:

SELECT unnest(ARRAY[5,3,9]) AS id;

行的结果顺序是“保证的”,但 Postgres 不断言任何东西。只要未明确定义顺序,查询优化器就可以随意对行进行排序。这可能会对更复杂的查询产生副作用。

如果您问题中的第二个查询是您真正想要的(向未嵌套的数组元素添加索引号),则有一个更好的方法 generate_subscripts() :

SELECT unnest(ARRAY[5,3,9]) AS id
, generate_subscripts(ARRAY[5,3,9], 1) AS idx
ORDER BY idx;

此相关答案中的详细信息:

您会对WITH ORDINALITY感兴趣在 Postgres 9.4 中:

然后你可以使用:

SELECT * FROM unnest(ARRAY[5,3,9]) WITH ORDINALITY tbl(id, idx);

关于sql - PostgreSQL 中的并行 unnest() 和排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23830991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com