我有一個表有超過100萬條記錄,我想從表中選擇隨機行,但不是在所有記錄中 - 只從符合特定條件的結果中選擇隨機行。MSSQL選擇在大數據中隨機
性能是很重要,所以我不能使用NEWID排序,然後選擇第一項。
表結構是一些這樣的事:
ID BIGINT
Title NVARCHAR(100)
Level INT
Point INT
現在,我寫了一個查詢,如:
with
tmp_one as
(
SELECT
R.Id as RID
FROM [User] as U
Inner Join
[Item] as R
On R.UserId = U.Id
WHERE ([R].[Level] BETWEEN @MinLevel AND @MaxLevel)
AND ((ABS((BINARY_CHECKSUM(NEWID(),R.Id,NEWID())))% 10000)/100) > @RangeOne
),
tmp_two as
(
Select tmp_one.RID as RID
From tmp_one
Where ((ABS((BINARY_CHECKSUM(NEWID(),RID,NEWID())))% 10000)/100) > @RangeTwo
),
tmp_three as
(
Select RID as RID
From tmp_two
Where ((ABS((BINARY_CHECKSUM(NEWID(),NEWID())))% 10000)/100) < @RangeThree
)
Select top 10 RID
From tmp_three
我想選擇10項隨機,然後選擇其中的一個,但我有一個驚人的問題!
有時輸出按物品等級排序!我不想要它(它不是真的隨機)。我真的不知道結果是按等級排序的。
請建議一些解決方案,幫助我選擇高性能隨機記錄和隨機選擇的高迭代範圍內不重複。
你有沒有ORDER BY TOP。所以你告訴SQL Server「我不關心訂單!」因此,SQL Server按照它認爲最有效的順序將數據返回給您。 – 2014-10-27 20:30:58
okey,我怎樣才能防止這種有效的順序,並告訴只使用默認的順序,不要改變它? (插入順序) 以及爲什麼這不會發生在常規選擇和選擇顯示數據插入順序? – Behrooz 2014-10-27 20:41:16
請點擊這裏閱讀#3:[SQL Server Assumptions](http://blogs.sqlsentry.com/aaronbertrand/t-sql-tuesday-56-sql-server-assumptions/) – 2014-10-27 20:52:55