Является ли MsSQL NEWID плохим, как MySQL Rand () - PullRequest
4 голосов
/ 31 марта 2011

согласно этой статье: http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/ использование ORDER BY RAND () - плохая идея, потому что:

Проблема в том, что MySQL придется выполнить операцию RAND () (котораяберет на себя вычислительную мощность) для каждой строки в таблице перед сортировкой и дает вам только 1 строку.

Теперь какой-то чувак с работы недавно обнаружил, что вы можете использовать ORDER BY NEWID () при использовании MsSQL(о котором я не знаю много).Теперь мой вопрос: является ли такая же плохая идея использовать NEWID (), как и RAND () - если так, как это должно быть сделано?

Ответы [ 3 ]

5 голосов
/ 31 марта 2011

Вот код, вызванный 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, поскольку оно не поддерживает переменные сеанса.

0 голосов
/ 01 апреля 2012

В * 1001 есть хорошая статья * EXPLAIN EXTENDED (http://explainextended.com/2009/03/01/selecting-random-rows/)

0 голосов
/ 06 сентября 2011

Вот отличная статья о том, как выбирать случайные строки, псевдокод для MSSQL и MySQL: Улучшение порядка по ранду и порядка по newid

...