Вот код, вызванный MySQL
RAND()
:
double my_rnd(struct rand_struct *rand_st)
{
rand_st->seed1=(rand_st->seed1*3+rand_st->seed2) % rand_st->max_value;
rand_st->seed2=(rand_st->seed1+rand_st->seed2+33) % rand_st->max_value;
return (((double) rand_st->seed1)/rand_st->max_value_dbl);
}
Вы можете оценить вычислительную мощность, необходимую для пары косвенных обращений, дополнений и модулей.
Реальная проблема с ORDER BY RAND()
заключается в том, что он должен сортировать (возможно, огромный) массив случайных чисел, а не вычислять их.
Те же проблемы справедливы и для SQL Server
, конечно.
В MySQL
вы можете избежать сортировки для выборки случайных записей:
Однако это решение не будет работать в SQL Server
, поскольку оно не поддерживает переменные сеанса.