首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 查詢結果隨機排序:NEWID() 實現隨機抽樣與分頁

     編輯:關於SqlServer

為什麼不用 RAND()?


SELECT * FROM Northwind..Orders ORDER BY RAND();  -- 錯誤!

RAND() 在單一查詢中**只計算一次**,所有列獲得相同隨機值,排序無效果。

正解:ORDER BY NEWID()


-- 全表隨機排序
SELECT * FROM Northwind..Orders ORDER BY NEWID();

-- 隨機抽取 10 筆
SELECT TOP 10 * FROM Northwind..Orders ORDER BY NEWID();
  • NEWID() 每列**獨立生成唯一識別碼 (GUID)**,天然隨機分佈
  • 無需額外函數、無種子問題、跨平台相容
  • 適用於:隨機抽樣、A/B 測試分桶、測試資料打亂、輪播廣告

效能考量

  • 大表 (百萬級) ORDER BY NEWID() 需全表掃描 + 排序,**較慢**
  • 優化策略:
    • 先 TABLESAMPLE (SQL 2005+) 粗略抽樣,再 ORDER BY NEWID() 精確取樣
    • WHERE RAND(CHECKSUM(NEWID())) < 0.01 伯努利抽樣 (近似 1%)
    • 建立輔助資料表預存隨機排序鍵,定期重算

可重現隨機排序 (測試/除錯用)


-- 固定種子:利用 CHECKSUM + 固定值
SELECT * FROM Orders ORDER BY CHECKSUM(NEWID(), 12345);  -- 每次結果相同

ORDER BY NEWID() 是 T-SQL 實現真隨機排序的標準慣用語。小表直用,大表配合抽樣技巧,滿足隨機抽樣、打亂順序等多樣需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved