快速从sqlserver中选择随机抽样

时间:2009-03-16 20:33:55

标签: sql sql-server database performance random

我有一个巨大的>表1000万行。我需要从中有效地获取5000的随机抽样。我有一些行为者减少了我想要的总行数,如9毫米。

我尝试使用NEWID()的顺序,但该查询将花费太长时间,因为它必须对所有行进行表扫描。

有更快的方法吗?

4 个答案:

答案 0 :(得分:21)

如果您可以使用伪随机抽样并且您使用的是SQL Server 2005/2008,那么请查看TABLESAMPLE。例如,SQL Server 2008 / AdventureWorks 2008中的一个示例,它基于行:

USE AdventureWorks2008; 
GO 


SELECT FirstName, LastName
FROM Person.Person 
TABLESAMPLE (100 ROWS)
WHERE EmailPromotion = 2;

问题是TABLESAMPLE不是完全随机的,因为它从每个物理页面生成给定数量的行。你可能无法获得5000行,除非你也限制TOP。如果您使用的是SQL Server 2000,则必须生成与主键匹配的临时表,或者您必须使用NEWID()方法执行此操作。

答案 1 :(得分:8)

您是否考虑过使用TABLESAMPLE子句?

例如:

select *
from HumanResources.Department tablesample (5 percent)

答案 2 :(得分:6)

SQL Server 2000解决方案,关于Microsoft(而不是较大的表上的慢速NEWID()):

SELECT * FROM Table1
WHERE (ABS(CAST(
 (BINARY_CHECKSUM(*) *
  RAND()) as int)) % 100) < 10
  

Microsoft的SQL Server团队意识到无法接受   随机的行样本很容易成为SQL Server 2000中的常见问题;   因此,该团队通过介绍解决了SQL Server 2005中的问题   TABLESAMPLE子句。此子句选择行的子集   选择随机数据页并返回其中的所有行   页面。但是,对于我们这些仍然拥有产品的人来说   SQL Server 2000需要向后兼容,或者需要真正的人   行级随机性,BINARY_CHECKSUM查询是非常有效的   解决方法。

解释可以在这里找到: http://msdn.microsoft.com/en-us/library/cc441928.aspx

答案 3 :(得分:4)

是的,tablesample是你的朋友(请注意,在统计意义上它不是随机的): Tablesample at msdn