我有一个大于1000万行的巨大表。我需要从中有效地获取5000个随机样本。我有一些限制因素,使我想要的总行数减少到9密耳。
我尝试通过NEWID()使用order,但是该查询将花费很长时间,因为它必须对所有行进行表扫描。
有没有更快的方法可以做到这一点?
如果您可以使用伪随机抽样并且您使用的是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并不是完全随机的,因为它会从每个物理页面生成给定数量的行。除非您也限制TOP,否则您可能无法准确返回5000行。如果您使用的是SQL Server 2000,则必须生成一个与主键匹配的临时表,或者必须使用使用NEWID()的方法来执行此操作。