Является ли Mysql СЕЙЧАС() ДЕТЕРМИНИСТИЧЕСКИМ

Когда вы отмечаете функцию MySQL как DETERMINISTIC, документация говорит

A routine is considered “deterministic” if it always produces the same result for the same input parameters, and “not deterministic” otherwise.

Это правда по времени? Должна ли функция DETERMINISTIC возвращать одинаковые результаты, если она вызывается в другом клиентском сеансе? Или в разных запросах в сеансе?

Другими словами, будет ли NOW() рассматриваться как DETERMINISTIC?


person Xenos    schedule 06.09.2015    source источник


Ответы (2)


NOW() очень недетерминирован, просто по вашему определению. Суть детерминизма в том, что он допускает различные оптимизации, основанные на предположениях, которые не будут выполняться, если ваши результаты зависят от текущего времени. См. http://forums.mysql.com/read.php?98,406891,406895#msg-406895 для примера обсуждения.

person Foon    schedule 06.09.2015
comment
Разве NOW() не является константой внутри запроса? Запрос SELECT NOW() FROM..., который занимает несколько секунд, возвращает те же значения, подразумевая, что NOW() считается константой во время выполнения запроса, не так ли? - person Xenos; 06.09.2015
comment
Нечто является детерминированным, если оно всегда возвращает одно и то же значение при вызове с одинаковыми параметрами. Детерминированные операции могут быть предметом общего исключения подвыражения (тип преобразования программы, используемый при автоматической оптимизации). NOW() не является детерминированным, несмотря на вашу интуицию. - person O. Jones; 06.09.2015
comment
Хорошо, я думал, что многократно вызванный вызов относится к нескольким вызовам в одном и том же запросе (поэтому RAND() не будет детерминированным), а не к разным запросам. - person Xenos; 06.09.2015

Согласно определению NOW() недетерминирован. Если бы он был детерминированным, он должен быть константой, так как принимает 0 параметров. Таким образом, это давало бы один и тот же результат при каждом вызове.

person user4035    schedule 06.09.2015
comment
Тот же результат даже среди времени? Итак, если у меня есть функция, включающая NOW(), она должна быть DETERMINISTIC, несмотря на то, что NOW() всегда возвращает один и тот же результат при использовании внутри запроса, такого как SELECT? - person Xenos; 06.09.2015
comment
@Xenos Тот же результат даже во времени? - да, это должен быть один и тот же результат независимо от времени. Простая детерминированная функция – sin(x). - person user4035; 06.09.2015