这是一道面试题。正如问题所说,面试官基本上要求我从数据库中获取 10 条随机记录。如果您知道有 n 条记录,这看起来很容易。但就我而言。我不允许搜索记录数。
有什么有效的方法来做到这一点?
这是一道面试题。正如问题所说,面试官基本上要求我从数据库中获取 10 条随机记录。如果您知道有 n 条记录,这看起来很容易。但就我而言。我不允许搜索记录数。
有什么有效的方法来做到这一点?
SELECT * FROM table ORDER BY RAND() LIMIT 10
这似乎基本上是SQL Server 随机排序的副本,它基本上是如何在 SQL 中请求随机行的副本?.
后者对引用这篇文章的多个 RDBMS 有一个全面的答案:
Microsoft SQL Server 的答案是:
SELECT TOP 10 * FROM table ORDER BY NEWID();
这在大表上表现不佳。它扫描整个表,为每一行生成一个唯一编号(16 位 GUID),然后按该唯一编号对结果进行排序。
在 SQL Server 中简单地通过 RAND() 排序不会产生随机的记录列表。RAND() 在语句的开头被评估一次,所以你实际上是按一个常数排序,这根本不是真正的排序。如果没有 ORDER BY,您将获得相同的结果。事实上,在我的 SQL Server 2005 实例中,无论是否使用 ORDER BY RAND(),查询计划和结果都是相同的。
SQL Server 中的 RAND() 采用种子值,因此您可能认为可以将不同的表列值传递给 RAND 函数并获得随机结果。从某种意义上说,你可以。您可以将 IDENTITY 或其他唯一列传递给 RAND 函数,并且您不会得到与没有相同的顺序。并且在不经意的观察者看来,顺序将是随机的。但它是可重复的。SQL Server 中的 RAND() 函数将始终为同一连接上的同一种子返回相同的值:
“对于一个连接,如果使用指定的种子值调用 RAND(),则 RAND() 的所有后续调用都会根据种子 RAND() 调用产生结果。”
http://technet.microsoft.com/en-us/library/ms177610.aspx
因此,虽然您会得到看似随机的列表,但如果您在同一个连接中多次执行它,您将得到相同的列表。根据您的要求,这可能就足够了。
根据我对小表的有限测试,具有唯一列种子的 RAND 的估计查询成本略低。