我想从一个非常大的表(数百万行)上的复杂查询的结果中选择一些随机的行。
我使用的是SQL Server2008,有效执行此操作的正确方法似乎是TABLESAMPLE子句。
注意1:我对流行的"order by NEWID()“解决方案不感兴趣-它对于大型表来说效率很低。
注意2:因为我的查询很复杂,所以如果可能的话,我不想首先计算它的计数。
注意3:由于结果集很大,我不想自己遍历它,比如建议的here。
关键是我使用的是LINQ。具体地说,LINQ-To-Entities。
有没有一种LINQ友好的方式来使用TABLESAMPLE?
即使没有直接的支持,有没有什么方法可以让我用LINQ编写大部分查询,然后执行少量的手动SQL来执行TABLESAMPLE?
发布于 2011-09-10 01:58:51
看起来我想要实现的目标根本就不可能实现。
TABLESAMPLE不能用于派生表,因此让一个复杂的查询生成一个大的结果集,然后使用TABLESAMPLE进行随机抽样甚至是不可行的。
TABLESAMPLE是只能在查询中的基表上使用的东西,在连接之前等等。(参见documentation)
This MSDN link描述了一种有效地获取随机百分比结果的方法,所以做我想做的事情的最佳方法可能是在视图中使用它,并在该视图的基础上构建我的LINQ。
感谢你们所有人的投入。
发布于 2011-09-09 08:04:47
不是您问题的直接答案,但您可以使用此技术选择单个行的随机百分比样本。以下查询使用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’
发布于 2011-09-09 08:06:37
像这样的东西应该可以工作(语法可能并不完全正确,但你应该明白了):
var rowCount = context.MyTable.Count();
int randomInt = new Random().Next(rowCount);
var query = context.MyTable.Skip(randomInt).FirstOrDefault();https://stackoverflow.com/questions/7355835
复制相似问题