我想从db获取一些随机记录。有两个解决方案:
1-使用TABLESAMPLE
直接从db获取数据。
2-编写方法在我的应用程序中执行此操作。在这个方法中,我们生成多个随机数并得到如下数据:
select * from db where ID = @RandomNumber
如果此ID不存在,我会传递一个新号码。
现在哪一个有更好的表现?
答案 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。
当然,通过编写存储过程可以实现最灵活,性能最佳的解决方案。
获得真正随机样本的成本(因此:最佳表现)取决于数据(数据类型,统计和分布,包括稀疏性)。