【发布时间】:2014-12-23 03:10:37
【问题描述】:
我有一个包含超过 100 万条记录的表,我想从该表中选择随机行,但不是从所有记录中选择 - 仅从匹配某些条件的结果中选择随机行。
性能非常重要,所以我不能使用 NEWID 排序然后选择第一个项目。
表结构是这样的:
ID BIGINT
Title NVARCHAR(100)
Level INT
Point INT
现在,我写了如下查询:
with
tmp_one as
(
SELECT
R.Id as RID
FROM [User] as U
Inner Join
[Item] as R
On R.UserId = U.Id
WHERE ([R].[Level] BETWEEN @MinLevel AND @MaxLevel)
AND ((ABS((BINARY_CHECKSUM(NEWID(),R.Id,NEWID())))% 10000)/100 ) > @RangeOne
),
tmp_two as
(
Select tmp_one.RID as RID
From tmp_one
Where ((ABS((BINARY_CHECKSUM(NEWID(),RID,NEWID())))% 10000)/100 ) > @RangeTwo
),
tmp_three as
(
Select RID as RID
From tmp_two
Where ((ABS((BINARY_CHECKSUM(NEWID(),NEWID())))% 10000)/100 ) < @RangeThree
)
Select top 10 RID
From tmp_three
我尝试随机选择10个项目,然后选择其中一个,但是我有一个惊人的问题!!!
有时输出是按项目级别排序的!而且我不想要它(它不是真正随机的)。我真的不知道结果是如何按级别排序的。
请提出一些解决方案,帮助我在高性能中选择随机记录,并且在高迭代范围内随机选择不重复。
【问题讨论】:
-
您拥有没有 ORDER BY 的 TOP。所以你告诉 SQL Server “我不在乎顺序!”因此,SQL Server 会按照 它 认为最有效的顺序将数据返回给您。
-
好的,我怎样才能阻止这种有效的订单并告诉它只使用默认订单而不更改它? (插入顺序)以及为什么在常规选择中不会发生这种情况并选择按插入顺序显示数据?
-
请点击此处阅读#3:SQL Server Assumptions
标签: sql sql-server tsql