MsSQL NEWID是不是像MySQL Rand()那样糟糕

时间:2011-03-31 14:31:00

标签: mysql sql-server random newid

根据这篇文章:http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/ 使用ORDER BY RAND()是一个坏主意,因为:

  

问题是,MySQL必须对表中的每一行执行RAND()操作(这需要处理能力),然后才对其进行排序,并且只给你一行。

现在有些老大的工作,最近发现在使用MsSQL时我可以使用ORDER BY NEWID()(我不太了解)。现在,我的问题是,使用NEWID()和使用RAND()同样是一个坏主意 - 如果是这样,那么应该怎么做呢?

3 个答案:

答案 0 :(得分:5)

以下是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()的真正问题是它需要对(可能很大的)random数组进行排序,而不是计算它们。

当然SQL Server同样存在问题。

MySQL中,您可以避免对随机记录采样进行排序:

但是,此解决方案在SQL Server中不起作用,因为它不支持会话变量。

答案 1 :(得分:0)

这是一篇关于如何为MSSQL和MySQL选择随机行,伪代码的优秀文章:Improving Order by rand and order by newid

答案 2 :(得分:0)