2017-10-09 124 views
0

我需要從我的sql表中選擇隨機行,當在谷歌搜索這種情況下,他們建議ORDER BY NEWID()但它降低了性能。由於我的表有超過2'000'000行數據,所以此解決方案不適合我。從SQL Server獲取隨機數據而沒有性能影響

我嘗試這樣的代碼來獲得隨機數據:

​​3210

它有時也下降的表現。

您能否建議從我的表中獲取隨機數據的好解決方案,我需要從表中獲取最少的行,如每行30行。我試圖表樣來獲取數據,但它沒有返回任何內容,一旦我添加我的where條件,因爲它返回的數據的頁面而不是基礎的行。

+0

[檢查這一點,我認爲這可以幫助你(https://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql) – Dogan

+0

您是否有表一個唯一的索引或主鍵? –

+0

是的,它有主鍵和唯一索引 – Manikandan

回答

1

嘗試先計算隨機ID,然後過濾大表。
因爲你的關鍵不在於身份,則需要數量的記錄,這將影響到表演..

注意的是,我用不同的條款,以確保獲得不同數量的

編輯:我已經修改查詢中使用你的大表

declare @n int = 30 

;with 
t as (
    -- EXTRACT DATA AND NUMBER ROWS 
    select *, ROW_NUMBER() over (order by YourPrimaryKey) n 
    from YourBigTable t 
    -- SOME FILTER 
    WHERE 1=1 /* <-- PUT HERE YOUR COMPLEX FILTER LOGIC */ 
), 
r as (
    -- RANDOM NUMBERS BETWEEN 1 AND COUNT(*) OF FILTERED TABLE 
    select distinct top (@n) abs(CHECKSUM(NEWID()) % n)+1 rnd 
    from sysobjects s 
    cross join (SELECT MAX(n) n FROM t) t 
) 
select t.* 
from t 
join r on r.rnd = t.n 
+0

由於我的表沒有整數的id值,我使用Uniqueidentifier – Manikandan

+0

不錯,對大表有好處,因爲我的表有超過2'000'000行 – Manikandan

+0

在我的測試中它非常非常快(250毫秒),也uniqueidentifier作爲primarykey,並且你可以使用更有效的函數替代'@ max'的COUNT(*)',並使其減少約30% – MtwStark

-1

任意過濾器如果你的唯一標識符鍵是一個隨機的GUID(不與NEWSEQUENTIALID()或UuidCreateSequential生成),你可以使用下面的方法。這將使用聚集主鍵索引而不對所有行進行排序。

SELECT t1.* 
FROM (VALUES(
     NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()) 
    ,(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()) 
    ,(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID()),(NEWID())) AS ThirtyKeys(ID) 
CROSS APPLY(SELECT TOP (1) * FROM dbo.Table1 WHERE ID >= ThirtyKeys.ID) AS t1; 
+0

嘿我的主鍵是新的sequentialId – Manikandan

+0

您可以提取30次相同的記錄 – MtwStark

+0

並且還可以獲得少於30條記錄 – MtwStark