2016-05-15 35 views
2

我試圖從stackoverflow數據轉儲中加入兩個表(用戶和帖子)後獲取1%的結果行的隨機樣本(http://data.stackexchange.com/ )。連接兩個表,然後從結果中隨機獲取n%的行。 (查詢http://data.stackexchange.com/中的表)

我用下面的查詢:

select top 1 percent * from users u join posts p ON p.OwnerUserId = u.Id 
order by newid(); 

由於在執行的時候,我得到了錯誤的一些服務器限制:

Error: "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."

有人可以建議我如何優化查詢?

回答

2

從大表中選擇隨機數據時,newid()並不是一個很好的選擇,因爲它需要對所有行進行排序 - 如果只選擇1%,那麼浪費大量時間。

微軟推薦使用binary_checksumselect rows randomly,如果1%的精度並不重要,這應該好了很多:

select * from Users u 
join (
    select * from Posts 
    WHERE (ABS(CAST(
    (BINARY_CHECKSUM 
    (Id, NEWID())) as int)) 
    % 100) < 1 
) p on p.OwnerUserId = u.Id 

由於帖子是一個視圖,這是不可能的使用tablesample,但在一個真實的情況下,這也是一個選項。

0

隨着rand()可以顯示行的隨機數是這樣的:

set @r = rand(); 
SELECT * FROM `anuncios` WHERE rand() < @r 
  • 請注意,這個方法你也可以得到零條記錄,如果你想獲得一個最小值,最大值甚至特定百分比的記錄播放將r變量設置爲任何您需要的值。
相關問題