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

Sql server 连接两个表,然后从结果中随机获取n%的行。(查询中的表)http://data.stackexchange.com/ ),sql-server,optimization,Sql Server,Optimization,在从stackoverflow数据转储中连接两个表users和Post之后,我尝试获取结果行的1%的随机样本 我使用了以下查询: select top 1 percent * from users u join posts p ON p.OwnerUserId = u.Id order by newid(); 由于服务器在执行时间上的一些限制,我得到了以下错误: 错误:超时已过期。操作完成前已过超时时间,或者服务器没有响应 有人能建议我如何优化查询吗?当从一个大表中选择随机数据时,newid

在从stackoverflow数据转储中连接两个表users和Post之后,我尝试获取结果行的1%的随机样本

我使用了以下查询:

select top 1 percent * from users u join posts p ON p.OwnerUserId = u.Id 
order by newid();
由于服务器在执行时间上的一些限制,我得到了以下错误:

错误:超时已过期。操作完成前已过超时时间,或者服务器没有响应


有人能建议我如何优化查询吗?

当从一个大表中选择随机数据时,newid并不是一个很好的选择,因为它需要对所有行进行排序——如果只选择了1%,那就浪费了很多时间

Microsoft已建议使用二进制校验和,如果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是一个视图,因此无法使用,但在实际情况下,这也是一个选项。

使用rand,您可以通过以下方式显示随机数行:

set @r = rand();
SELECT * FROM `anuncios` WHERE rand() < @r 
请注意,使用此方法,如果您希望获得最小、最大甚至特定播放百分比的记录,那么您也可以获得零记录。请将rvariable设置为您需要的任何值。