我想查詢一個相當大的表(數百萬行),提供一個種子值,以保證隨機順序的方式 - 但只要使用相同的種子,在多個查詢中保持穩定。SQL Server中的高性能穩定隨機排序?
我來了這麼遠,最好是
SELECT TOP n *
FROM tbl t
ORDER BY t.int_column % seed, t.int_column
這是一個有用的方法,無論是從性能的角度和結果行了不同的種子有點均勻分佈?
編輯:
對於上下文,是因爲多個所需要的穩定的排序 - 可能是嵌套 - WHERE NOT IN
的查詢對相同的數據集進行操作;例如
SELECT *
FROM tbl t
WHERE t.some_criteria = 'some_value'
AND t.id NOT IN
(
SELECT TOP n t.id
FROM tbl t
WHERE t.some_other_criteria = 'some_other_value'
ORDER BY t.int_column % seed, t.int_column
)
AND t.id NOT IN
(
# etc.
)
當子選擇的順序是隨機的,但不是穩定的(即NEWID()
,TABLESAMPLE()
),其結果列大起大落執行之間。
數據在哪裏被消費?如果不是將數據傳遞給另一個存儲過程或其他數據庫內代碼,那麼按照非平凡標準對行進行排序是一種視圖級別的問題,不應該存在於數據庫代碼中,而應該放在應用程序中碼。 – Dai
@戴 - 偉大的問題。請參閱我的編輯。 – vzwick
你總是會對所有記錄進行排序,這些記錄可能相當多。你確定你需要所有'NOT IN'子句嗎?也許你可以稍微簡化查詢。你究竟想達到什麼目的? –