从 SQL 服务器获取随机数据而不影响性能

Get random data from SQL Server without performance impact

我需要 select 来自 sql table 的随机行,当在 google 中搜索这种情况时,他们建议 ORDER BY NEWID() 但它减少了表现。由于我的 table 有超过 2'000'000 行数据,这个解决方案不适合我。

我试过这段代码来获取随机数据:

SELECT TOP 10 * 
FROM Table1
WHERE (ABS(CAST((BINARY_CHECKSUM(*) * RAND()) AS INT)) % 100) < 10 

它有时也会降低性能。

您能否建议从我的 table 获取随机数据的好的解决方案,我需要从 table 中获取最少的行,例如每个请求 30 行。我尝试 TableSAMPLE 来获取数据,但是一旦我添加了我的 where 条件,它 return 就什么都没有了,因为它 return 数据是基于页面而不是基于排。

在过滤你的大 table 之前尝试计算随机 ID。
由于您的密钥不是身份,因此您需要对记录进行编号,这会影响性能..

注意,我使用了不同的子句来确保得到不同的数字

编辑:我已修改查询以在您的大 table

上使用任意过滤器
declare @n int = 30

;with
t as (
    -- EXTRACT DATA AND NUMBER ROWS
    select *, ROW_NUMBER() over (order by YourPrimaryKey) n
    from YourBigTable t
    -- SOME FILTER
    WHERE 1=1  /* <-- PUT HERE YOUR COMPLEX FILTER LOGIC */
),
r as (
    -- RANDOM NUMBERS BETWEEN 1 AND COUNT(*) OF FILTERED TABLE
    select distinct top (@n) abs(CHECKSUM(NEWID()) % n)+1  rnd
    from sysobjects s
    cross join (SELECT MAX(n) n FROM t) t
)
select t.*
from t
join r on r.rnd =  t.n

如果您的 uniqueidentifier 键是一个随机 GUID(不是用 NEWSEQUENTIALID() 或 UuidCreateSequential 生成的),您可以使用下面的方法。这将使用聚簇主键索引而不对所有行进行排序。

SELECT t1.*
FROM (VALUES(
      NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID())
    ,(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID())
    ,(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID())) AS ThirtyKeys(ID)
CROSS APPLY(SELECT TOP (1) * FROM dbo.Table1 WHERE ID >= ThirtyKeys.ID) AS t1;