2011-09-08 37 views
4

我想从一个非常大的表(数百万行)上的复杂查询结果中选择一些随机行。使用LINQ(ala TABLESAMPLE)从大型结果集中有效地选择随机行

我正在使用SQL Server 2008,正确的方法有效地做到这一点似乎是TABLESAMPLE子句。注意1:我对流行的“NEWID(order by order by NEWID)”解决方案不感兴趣 - 对于大型表格来说效率不高。注意2:由于我的查询很复杂,如果可能的话,我不想先计算COUNT。注意3:由于结果集很大,我不想自己遍历它,比如建议的here

踢球者是我使用LINQ。具体来说,LINQ-To-Entities。

是否有LINQ友好的方式来使用TABLESAMPLE?

即使没有直接的支持,有没有什么方法可以在LINQ中编写我的大部分查询,然后执行少量的手动SQL来执行TABLESAMPLE?

+0

请注意,TABLESAMPLE不会给你一个真正的随机样本。 –

+0

@Mitch - 采取的点。在这种情况下,确切的分布对我来说并不重要,只要它有点分散。 – jwd

+0

+1。有趣的问题。也许将标题改为“使用LINQ从非常大的表中选择随机行” –

回答

0

看来,我想要完成甚至不可能摆在首位。

TABLESAMPLE不能在派生表上使用,所以用一个复杂的查询生成一个大的结果集,然后用TABLESAMPLE获得一个随机抽样是不可行的。

TABLESAMPLE仅适用于在连接和soforth之前进入查询的基表上。 (请参阅documentation

This MSDN link描述了一种有效获得随机结果百分比的方法,因此,最好的方法是在视图中使用该方法,然后从该视图构建我的LINQ。

谢谢大家的意见。

0

不是您的问题的直接答案,但您可以使用此技术来选择单个行的随机百分比样本。下面的查询使用NEWID函数返回Sales.SalesOrderDetail表中的行的约百分之一:

SELECT * FROM Sales.SalesOrderDetail 
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)/CAST (0x7fffffff AS int) 

可能感兴趣的:T-SQL: Generating Random Numbers, Random Sampling and Random ‘Goodness’

+0

啊,是的,似乎类似于这个链接:http://msdn.microsoft.com/en-us/library/cc441928.aspx如果你有一种方式在LINQ友好我很好奇,也知道这一点。 – jwd

0

像这样的东西应该工作(语法可能不完全正确但您应该明白):

var rowCount = context.MyTable.Count(); 

int randomInt = new Random().Next(rowCount);  
var query = context.MyTable.Skip(randomInt).FirstOrDefault(); 
+0

我对这种方法有几个问题:(1)每个查询只得到一行[如果可能,我想在一个镜头中获得多行](2)在运行我的(复杂!)查询之前需要计算计数。我会更新这个问题,注意查询很复杂。 – jwd

0

使用EF,您可以使用tablesample构造在您的模型中创建一个定义查询。见http://msdn.microsoft.com/en-us/library/cc982038.aspx。或者,您可以在数据库中创建随机视图,然后在模型中包含该视图。

+0

TABLESAMPLE不能用于视图定义。有一个很好的评论线程关于这个,但问题被删除): – jwd

+0

(我的意思是*答案*被删除:) – jwd

+0

@jwd感谢您的更正。定义查询仍然是一种可能性,因为它是纯粹的SQL而不是保存的视图。 –