簡體   English   中英

哪個解決方案更適合從db獲取隨機記錄集?

[英]Which solution is better for getting random record set from db?

我想從db獲得一些隨機記錄。 這有兩個解決方案:

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

2-編寫方法在我的應用程序中執行此操作。 在這個方法中,我們生成多個隨機數並獲取如下數據:

select * from db where ID = @RandomNumber

如果此ID不存在,我會傳遞一個新號碼。

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

根據TABESAMPLE文檔,如果您“真的想要單個行的樣本”,則不應使用它:

如果您確實需要單個行的隨機樣本,請修改查詢以隨機過濾行,而不是使用TABLESAMPLE。 例如,以下查詢使用NEWID函數返回Sales.SalesOrderDetail表的大約百分之一的行:

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

SalesOrderID列包含在CHECKSUM表達式中,以便NEWID()每行計算一次以實現每行的采樣。 表達式CAST(CHECKSUM(NEWID(),> SalesOrderID) & 0x7fffffff AS float / CAST(0x7fffffff AS int)求值為0到1之間的隨機浮點值。

無論哪種方式,考慮到你可以通過傳入@RandomNumber進行無限數量的請求(理論上你做的前1000個請求可能什么也不返回),更好的方法是限制服務器上的結果集。

試試這個:

SELECT TOP 1 * FROM db
ORDER BY NEWID()

NewID函數將生成UniqueIdentifier值,它將是隨機的。 來源: SQL從數據庫表中選擇一個隨機行

我會使用TABLESAMPLE,因為它可以很容易地生成樣本數據。 我希望它只會調用一塊SQL會更有效率。

例如

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

在您的另一個示例中,您將不得不繼續多次調用select * from db where ID = @RandomNumber

如果你在單獨的行后,我會使用另一種方法,某種形式的隨機TOP 1等...

我建議閱讀一篇關於從表中獲取隨機行的各種方法的帖子。 它基於PostgreSQL,但我確信90%也適用於SQL Server。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM