9,4 против 10 различий в порядке случайного () - PullRequest
0 голосов
/ 25 мая 2018

Следующий запрос не рандомизирует массив в 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 ]

0 голосов
/ 25 мая 2018

Это является следствием коммита 69f4b9c85f168ae006929eec44fc44d569e846b9 , который меняет способ обработки возвращающих набор функций в списке SELECT.

Ответ Тима и ваш комментарий показывают, как справиться с проблемой.

0 голосов
/ 25 мая 2018

Я думаю, что проблема здесь в том, что в новой версии 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();

Демо

Вы можете наблюдать в демонстрации, что порядокна самом деле случайный.Тем не менее, в той же демонстрации, если вы выполняете свой оригинальный запрос, порядок не будет случайным.

Редактировать:

Причина, по которой этот трюк работает, заключается в том, что *Предложение 1020 * убеждает оптимизатора в том, что вы действительно заботитесь о значениях, используемых в каждой записи.Поэтому он вызывает функцию в ORDER BY один раз для каждой записи, а не кэширует ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...