不要用newid() 这种方式,扫描全表,我的表大,很慢。用这种方式:
SELECT TOP 10 *
FROM TB1
WHERE (id > CAST(FLOOR(RAND() *
          (SELECT COUNT(id)
         FROM [TB1])) AS int))效果不行,如果两次查询间隔很近,查询的结果十之八九是相同的,还有什么好办法吗?要兼顾执行效率。

解决方案 »

  1.   

    楼主试试加序号列,用 rand() 去取。
      

  2.   

    用函数rand()就可以随机取出数据。
      

  3.   

    SELECT TOP 10 *
    FROM TB1
    WHERE id > ABS(CHECKSUM(NEWID()) )
      

  4.   

    说了,用newid比较慢,排除之。
      

  5.   

    newid(),rand()都可以,根据实际情况选择
      

  6.   


    如果只是需要一些样本,可以使用TableSample来限制结果集select * from dbo.User_Core tablesample system(10 rows)
    select * from dbo.User_Core tablesample system(10 percent)select top 1 * from dbo.User_Core tablesample system(100 rows)
    select top 1 * from dbo.User_Core tablesample system(100 percent)percent是表数据页的百分比,而不是记录数的百分比,因此记录数目是不确定的
    row 也是大约行数具体请参见联机帮助
    /* --摘抄至联机帮助
    如果确实需要单个行的随机抽样,则应修改查询以随机筛选出行,而不是使用 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 之间的随机 float 值。
    */