以下查询不是在postgres 10中随机化数组。这是预期的行为吗?
array
------------------------
{7,1,10,6,2,8,9,4,5,3}
v9.4.15
array
------------------------
{1,2,3,4,5,6,7,8,9,10}
10.4
{{1}}
答案 0 :(得分:2)
这是commit 69f4b9c85f168ae006929eec44fc44d569e846b9的结果,它改变了SELECT
列表中的集合返回函数的处理方式。
答案 1 :(得分:1)
我认为这里的问题是较新版本的Postgres有一个更聪明的优化器,并在单次调用该函数后缓存random()
的值。
一种解决方法是强制为每条记录计算新的随机值。我们可以添加一个虚拟WHERE
子句来强制执行此操作:
WITH cte AS (
select generate_series(1,10) AS col
)
SELECT col
FROM cte
WHERE col IS NOT NULL
ORDER BY random();
您可以在演示中观察到订单实际上是随机的。但是,如果您运行您的原始查询,则在同一演示中,订单不会是随机的。
修改强>
这个技巧的工作原理是WHERE
子句使优化器相信你真正关心每个记录中使用的值。因此,它会在ORDER BY
中为每条记录调用一次函数,而不是缓存它。