我有一个巨大的>表1000万行。我需要从中有效地获取5000的随机抽样。我有一些行为者减少了我想要的总行数,如9毫米。
我尝试使用NEWID()的顺序,但该查询将花费太长时间,因为它必须对所有行进行表扫描。
有更快的方法吗?
答案 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