代码之家  ›  专栏  ›  技术社区  ›  masoud ramezani

哪个解决方案更适合从数据库中获取随机记录集?

  •  4
  • masoud ramezani  · 技术社区  · 15 年前

    我想从数据库中得到一些随机记录。有两种解决方案:

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

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

    select * from db where ID = @RandomNumber
    

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

    现在哪一个性能更好?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Rob    15 年前

    根据 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列包含在 校验和表达式,以便 newid()每行计算一次 按行取样。 表达式 CAST(CHECKSUM(NEWID(),> SalesOrderID) & 0x7fffffff AS float / CAST(0x7fffffff AS int) 计算为介于0和1之间的随机浮点值。

    不管怎样,考虑到通过传入@randomnumber(理论上,您发出的前1000个请求可能不会返回任何结果)可以发出的请求数量可能是无限的,最好的方法是限制服务器上的结果集。

        2
  •  2
  •   Wael Dalloul    15 年前

    试试这个:

    SELECT TOP 1 * FROM db
    ORDER BY NEWID()
    

    newid函数将生成唯一标识符值,并且是随机的。 来源: SQL to Select a random row from a database table

        3
  •  1
  •   kevchadders    15 年前

    我将使用tablesample,因为它使生成示例数据非常容易。我希望它会更高效,因为您只需要调用一段SQL。

    例如

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

    在你的另一个例子中,你必须继续打电话 select * from db where ID = @RandomNumber 很多次。

    如果你在单行之后,我会用另一种方法,一些形式的随机前1等…

        4
  •  0
  •   filiprem    15 年前

    我建议读一篇关于 various methods to get random row from table . 它是基于PostgreSQL的,但我相信90%也适用于SQL Server。

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

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