Sql server 使用LINQ(ala TABLESAMPLE)从大型结果集中高效地选择随机行
我想从一个非常大的表(数百万行)上的复杂查询结果中选择一小部分随机行 我使用的是SQLServer2008,有效地实现这一点的正确方法似乎是使用子句 注1:我对流行的“orderbynewid()”解决方案不感兴趣-它对于大型表来说效率很低 注2:由于我的查询很复杂,如果可能的话,我不想首先计算它的计数 注3:由于resultset很大,我不想像建议的那样自己遍历它 关键是我用的是LINQ。具体来说,LINQ是一种实体 是否有一种LINQ友好的方式来使用TABLESAMPLESql server 使用LINQ(ala TABLESAMPLE)从大型结果集中高效地选择随机行,sql-server,linq,sql-server-2008,random,linq-to-entities,Sql Server,Linq,Sql Server 2008,Random,Linq To Entities,我想从一个非常大的表(数百万行)上的复杂查询结果中选择一小部分随机行 我使用的是SQLServer2008,有效地实现这一点的正确方法似乎是使用子句 注1:我对流行的“orderbynewid()”解决方案不感兴趣-它对于大型表来说效率很低 注2:由于我的查询很复杂,如果可能的话,我不想首先计算它的计数 注3:由于resultset很大,我不想像建议的那样自己遍历它 关键是我用的是LINQ。具体来说,LINQ是一种实体 是否有一种LINQ友好的方式来使用TABLESAMPLE 即使没有直接的支持
即使没有直接的支持,是否有某种方法可以用LINQ编写大部分查询,然后执行少量手动SQL来执行TABLESAMPLE?不是对您的问题的直接回答,但您可以使用此技术选择单个行的随机百分比样本。以下查询使用NEWID函数返回Sales.SalesOrderDetail表中大约百分之一的行:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)
可能感兴趣:类似的东西应该可以工作(语法可能不完全正确,但您应该明白):
使用EF,您可以使用tablesample构造在模型中创建定义查询。看见或者,您可以在数据库中创建一个随机视图,然后将该视图包括在模型中。我想实现的似乎一开始就不可能实现 TABLESAMPLE不能用于派生表,因此让一个复杂的查询生成一个大的结果集,然后使用TABLESAMPLE进行随机采样甚至是不可行的 TABLESAMPLE是在联接和soforth之前,只能在进入查询的基表上使用的东西。(见附件) 描述了一种有效获取随机百分比结果的方法,因此,大致实现我想要的效果的最佳方法可能是在视图中使用该结果,并根据该视图构建LINQ
谢谢大家的意见。请注意,TABLESAMPLE不会提供真正的随机样本。@Mitch-Point Take。在这种情况下,准确的分布对我来说并不重要,只要它有点分散。有趣的问题。也许将标题改为“使用LINQ从一个非常大的表中选择随机行”是个好主意;我更新了标题。啊!!我知道您已经看到postAh yes似乎与此链接类似:如果您有一种以LINQ友好的方式实现这一点的方法,我也很想知道。这种方法有几个问题:(1)每个查询只获取一行[如果可能,我希望一次获取多行](2)在运行我的查询之前需要计算计数(复杂!)查询。我将更新该问题以注意该查询是复杂的。TABLESAMPLE不能用于视图定义中。对此有一个很好的评论线程,但该问题已被删除):(我的意思是答案已被删除:)@jwd感谢您的更正。定义查询仍然是可能的,因为它是纯SQL而不是保存的视图。
var rowCount = context.MyTable.Count();
int randomInt = new Random().Next(rowCount);
var query = context.MyTable.Skip(randomInt).FirstOrDefault();