2011-09-08 58 views
4

我想從一個非常大的表(數百萬行)上的複雜查詢結果中選擇一些隨機行。使用LINQ(ala TABLESAMPLE)從大型結果集中有效地選擇隨機行

我正在使用SQL Server 2008,正確的方法有效地做到這一點似乎是TABLESAMPLE子句。注意1:我對流行的「NEWID(order by order by NEWID)」解決方案不感興趣 - 對於大型表格來說效率不高。注意2:由於我的查詢很複雜,如果可能的話,我不想先計算COUNT。注意3:由於結果集很大,我不想自己遍歷它,比如建議的here

踢球者是我使用LINQ。具體來說,LINQ-To-Entities。

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

即使沒有直接的支持,有沒有什麼方法可以在LINQ中編寫我的大部分查詢,然後執行少量的手動SQL來執行TABLESAMPLE?

+0

請注意,TABLESAMPLE不會給你一個真正的隨機樣本。 –

+0

@Mitch - 採取的點。在這種情況下,確切的分佈對我來說並不重要,只要它有點分散。 – jwd

+0

+1。有趣的問題。也許將標題改爲「使用LINQ從非常大的表中選擇隨機行」 –

回答

0

看來,我想要完成甚至不可能擺在首位。

TABLESAMPLE不能在派生表上使用,所以用一個複雜的查詢生成一個大的結果集,然後用TABLESAMPLE獲得一個隨機抽樣是不可行的。

TABLESAMPLE僅適用於在連接和soforth之前進入查詢的基表上。 (請參閱documentation

This MSDN link描述了一種有效獲得隨機結果百分比的方法,因此,最好的方法是在視圖中使用該方法,然後從該視圖構建我的LINQ。

謝謝大家的意見。

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’

+0

啊,是的,似乎類似於這個鏈接:http://msdn.microsoft.com/en-us/library/cc441928.aspx如果你有一種方式在LINQ友好我很好奇,也知道這一點。 – jwd

0

像這樣的東西應該工作(語法可能不完全正確但您應該明白):

var rowCount = context.MyTable.Count(); 

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

我對這種方法有幾個問題:(1)每個查詢只得到一行[如果可能,我想在一個鏡頭中獲得多行](2)在運行我的(複雜!)查詢之前需要計算計數。我會更新這個問題,注意查詢很複雜。 – jwd

0

使用EF,您可以使用tablesample構造在您的模型中創建一個定義查詢。見http://msdn.microsoft.com/en-us/library/cc982038.aspx。或者,您可以在數據庫中創建隨機視圖,然後在模型中包含該視圖。

+0

TABLESAMPLE不能用於視圖定義。有一個很好的評論線程關於這個,但問題被刪除): – jwd

+0

(我的意思是*答案*被刪除:) – jwd

+0

@jwd感謝您的更正。定義查詢仍然是一種可能性,因爲它是純粹的SQL而不是保存的視圖。 –