使用LINQ(ala TABLESAMPLE)从大型结果集中有效地选择随机行

时间:2011-09-08 23:59:01

标签: sql-server linq sql-server-2008 random linq-to-entities

我想从非常大的表(数百万行)上的复杂查询结果中选择一些随机行。

我正在使用SQL Server 2008,正确地执行此操作的正确方法似乎是TABLESAMPLE子句。

注1:我对流行的“NEWID()订单”解决方案不感兴趣 - 对于大型表来说效率很低。

注意2:由于我的查询很复杂,如果可能,我不想首先计算COUNT。

注3:由于结果集很大,我不想自己遍历它,例如建议here

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

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

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

4 个答案:

答案 0 :(得分: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’

答案 1 :(得分:0)

这样的事情应该有用(语法可能不完全正确,但你应该明白这一点):

var rowCount = context.MyTable.Count();

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

似乎我想要完成的事情首先是不可能的。

TABLESAMPLE不能在派生表上使用,因此使用复杂查询生成大型结果集然后使用TABLESAMPLE进行随机抽样甚至不可行。

TABLESAMPLE只是可以在连接和软件之前进入查询的基表上使用的东西。 (见documentation

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

谢谢大家的意见。