哪个解决方案更适合从db获取随机记录集?

时间:2010-03-02 09:04:28

标签: c# sql-server random

我想从db获取一些随机记录。有两个解决方案:

1-使用TABLESAMPLE直接从db获取数据。

2-编写方法在我的应用程序中执行此操作。在这个方法中,我们生成多个随机数并得到如下数据:

select * from db where ID = @RandomNumber

如果此ID不存在,我会传递一个新号码。

现在哪一个有更好的表现?

4 个答案:

答案 0 :(得分:3)

根据documentation for TABESAMPLE,如果您“真的想要单个行的样本”,

  

如果你真的想要随机抽样   单个行,修改您的查询   随机过滤掉行,而不是   使用TABLESAMPLE。例如,   以下查询使用NEWID   函数返回大约一个   行的百分比   Sales.SalesOrderDetail表:

 SELECT  * 
 FROM    Sales.SalesOrderDetail
 WHERE   0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
         / CAST (0x7fffffff AS int)
     

SalesOrderID列包含在中   CHECKSUM表达式   NEWID()每行评估一次   实现每行采样。   表达式CAST(CHECKSUM(NEWID(),> SalesOrderID) & 0x7fffffff AS float / CAST(0x7fffffff AS int)的计算结果为0到1之间的随机浮点值。

无论哪种方式,考虑到你可以通过传入@RandomNumber进行无限数量的请求(理论上你所做的前1000个请求可能什么都不返回),更好的方法是限制服务器上的结果集。

答案 1 :(得分:2)

试试这个:

SELECT TOP 1 * FROM db
ORDER BY NEWID()

NewID函数将生成UniqueIdentifier值,它将是随机的。 资料来源:SQL to Select a random row from a database table

答案 2 :(得分:1)

我会使用TABLESAMPLE,因为它可以很容易地生成样本数据。我希望它只会调用一个SQL来提高效率。

e.g。

USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact 
TABLESAMPLE (10 PERCENT) 

在您的其他示例中,您必须多次调用select * from db where ID = @RandomNumber

如果您在单个行之后,那么我将使用另一种方法,某种形式的随机TOP 1等......

答案 3 :(得分:0)

我建议您阅读有关various methods to get random row from table的帖子。它基于PostgreSQL,但我确信90%也适用于SQL Server。

当然,通过编写存储过程可以实现最灵活,性能最佳的解决方案。

获得真正随机样本的成本(因此:最佳表现)取决于数据(数据类型,统计和分布,包括稀疏性)。