bugfix> postgresql > 投稿

次のクエリはpostgres 10の配列をランダム化していません。これは予想される動作ですか?

select array(select generate_series(1,10) order by random());

v9.4.15

    array
------------------------
 {7,1,10,6,2,8,9,4,5,3}

v10.4

        array
------------------------
 {1,2,3,4,5,6,7,8,9,10}

回答 2 件
  • これは、コミット69f4b9c85f168ae006929eec44fc44d569e846b9の結果であり、 SELECT でのset-returning関数の方法が変更されます  リストが処理されます。

    ティムの答えとコメントは、問題への対処方法を示しています。

  • ここでの問題は、Postgresの新しいバージョンがオプティマイザーを持っていることだと思う。  その関数を1回呼び出した後。

    回避策の1つは、レコードごとに新しいランダム値を強制的に計算することです。ダミーの 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 の関数を呼び出します  キャッシュするのではなく、レコードごとに1回。

    ORDER BY

あなたの答え