首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ从大型结果集中有效地选择随机行(ala TABLESAMPLE)

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

Stack Overflow用户
提问于 2011-09-09 07:59:01
回答 4查看 1.9K关注 0票数 4

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

我使用的是SQL Server2008,有效执行此操作的正确方法似乎是TABLESAMPLE子句。

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

注意2:因为我的查询很复杂,所以如果可能的话,我不想首先计算它的计数。

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

关键是我使用的是LINQ。具体地说,LINQ-To-Entities。

有没有一种LINQ友好的方式来使用TABLESAMPLE?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-10 01:58:51

看起来我想要实现的目标根本就不可能实现。

TABLESAMPLE不能用于派生表,因此让一个复杂的查询生成一个大的结果集,然后使用TABLESAMPLE进行随机抽样甚至是不可行的。

TABLESAMPLE是只能在查询中的基表上使用的东西,在连接之前等等。(参见documentation)

This MSDN link描述了一种有效地获取随机百分比结果的方法,所以做我想做的事情的最佳方法可能是在视图中使用它,并在该视图的基础上构建我的LINQ。

感谢你们所有人的投入。

票数 0
EN

Stack Overflow用户

发布于 2011-09-09 08:04:47

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-09-09 08:06:37

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

代码语言:javascript
复制
var rowCount = context.MyTable.Count();

int randomInt = new Random().Next(rowCount);    
var query = context.MyTable.Skip(randomInt).FirstOrDefault();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7355835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档