pg 9.4 vs 10个随机订单差异()

时间:2018-05-25 06:39:40

标签: postgresql

以下查询不是在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}}

2 个答案:

答案 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();

Demo

您可以在演示中观察到订单实际上是随机的。但是,如果您运行您的原始查询,则在同一演示中,订单不会是随机的。

修改

这个技巧的工作原理是WHERE子句使优化器相信你真正关心每个记录中使用的值。因此,它会在ORDER BY中为每条记录调用一次函数,而不是缓存它。