我想从非常大的表(数百万行)上的复杂查询结果中选择一些随机行。
我正在使用SQL Server 2008,正确地执行此操作的正确方法似乎是TABLESAMPLE子句。
注1:我对流行的“NEWID()订单”解决方案不感兴趣 - 对于大型表来说效率很低。
注意2:由于我的查询很复杂,如果可能,我不想首先计算COUNT。
注3:由于结果集很大,我不想自己遍历它,例如建议here。
踢球者是我正在使用LINQ。具体来说,LINQ-To-Entities。
是否有使用TABLESAMPLE的LINQ友好方式?
即使没有直接支持,是否有某种方法可以在LINQ中编写我的大部分查询,然后执行少量手动SQL来执行TABLESAMPLE?
答案 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。
谢谢大家的意见。