在从stackoverflow数据转储(https://data.stackexchange.com/)。
我使用了以下查询:
select top 1 percent * from users u join posts p ON p.OwnerUserId = u.Id
order by newid();
由于服务器对执行时间的一些限制,我得到了错误:
错误:";超时已过期。在操作完成或服务器没有响应之前经过的超时时间"
有人能建议我如何优化查询吗?
从大表中选择随机数据时,newid()并不是一个很好的选项,因为它需要对所有行进行排序——如果只选择1%,那将浪费大量时间。
微软建议使用binary_checksum
随机选择行,如果1%的准确性不重要,这应该会更好:
select * from Users u
join (
select * from Posts
WHERE (ABS(CAST(
(BINARY_CHECKSUM
(Id, NEWID())) as int))
% 100) < 1
) p on p.OwnerUserId = u.Id
由于posts是一个视图,所以不可能使用tablesample,但在实际情况下,这也是一个选项。
使用rand()
,您可以通过以下方式显示随机数目的行:
set @r = rand();
SELECT * FROM `anuncios` WHERE rand() < @r
- 注意,如果您想获得播放记录的最小、最大甚至特定百分比,则使用此方法也可以获得零记录,将
r
变量设置为所需的任何值