连接两个表,然后从结果中随机提取n%的行.(查询中的表http://data.stackexchange.com/)



在从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变量设置为所需的任何值

最新更新