我需要从我的sql表中随机选择行,在谷歌中搜索这种情况时,他们建议ORDER BY NEWID()
但这会降低性能。由于我的表包含超过 2'000'000 行数据,因此此解决方案不适合我。
我尝试了这段代码来获取随机数据:
SELECT TOP 10 *
FROM Table1
WHERE (ABS(CAST((BINARY_CHECKSUM(*) * RAND()) AS INT)) % 100) < 10
它有时也会降低性能。
您能否提出从我的表中获取随机数据的良好解决方案,我需要该表中的最小行,例如每个请求 30 行。我尝试了 TableSAMPLE 来获取数据,但一旦我添加了我的 where 条件,它就不返回任何内容,因为它按页面基础而不是行的基础返回数据。
尝试在过滤大表之前计算随机 ID。
由于您的密钥不是身份,因此您需要对记录进行编号,这将影响性能。
注意,我使用了不同的子句来确保得到不同的数字
编辑:我已经修改了查询以在您的大表上使用任意过滤器
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
如果您的唯一标识符键是随机 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;