2010-03-02 54 views
4

我想從數據庫中獲取一些隨機記錄。有兩種解決方案:哪個解決方案更適合從db獲取隨機記錄集?

1-使用TABLESAMPLE直接從db中獲取數據。

2-寫一個方法在我的應用程序中這樣做。在這種方法中,我們生成多個隨機數和獲得的數據是這樣的:

select * from db where ID = @RandomNumber 

如果此ID不存在,我通過一個新號碼。

現在哪一個有更好的表現?

回答

3

按照documentation for TABESAMPLE不應該使用它,如果你「真的要的樣品各行「:

如果你真的想要的 各行的隨機抽樣,修改查詢到 過濾掉行隨機,而不是使用 TABLESAMPLE。例如, 以下查詢使用NEWID 函數返回 Sales.SalesOrderDetail表中的行的大約百分之 :

SELECT * 
FROM Sales.SalesOrderDetail 
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) 
     /CAST (0x7fffffff AS int) 

的的SalesOrderID列包括在 校驗表達使得 NEWID ()每行評估一次到 以每行爲基礎實現採樣。 表達CAST(CHECKSUM(NEWID(),> SalesOrderID) & 0x7fffffff AS float/CAST(0x7fffffff AS int)計算爲一個隨機浮點值0和1之間

不管怎樣,考慮到潛在的數不完的請求,你可以通過在@RandomNumber傳遞(理論上第1000個請求讓你做可能會返回沒有),更好的方法是限制服務器上的結果集。

1

我會使用TABLESAMPLE,因爲它可以非常容易地生成示例數據。我希望它會更有效率,因爲你只調用一塊SQL。

例如

USE AdventureWorks ; 
GO 
SELECT FirstName, LastName 
FROM Person.Contact 
TABLESAMPLE (10 PERCENT) 

在你的其他例子,你將不得不繼續呼籲select * from db where ID = @RandomNumber多次。

如果各行後,然後我會用另一種方法,某種形式的隨機TOP 1等...

2

試試這個:

SELECT TOP 1 * FROM db 
ORDER BY NEWID() 

NEWID函數將產生唯一標識符值,這將是隨機的。 來源:SQL to Select a random row from a database table

+3

問題是「哪種方法提供了更好的性能」,所以我不會推薦ORDER BY NEWID()。它需要將NEWID()分配給所有行,然後將它們全部排序。這對於大型記錄集來說是很昂貴的! – filiprem 2010-03-02 09:22:19

0

我推薦閱讀一篇關於various methods to get random row from table的文章。它基於PostgreSQL,但我相信90%也適用於SQL Server。

當然,最靈活和最好的解決方案可以通過編寫存儲過程來實現。

獲得真正隨機樣本的成本(因此:最佳性能)取決於數據(數據類型,統計量和分佈,包括稀疏性)。