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

各主流資料庫隨機抽樣查詢寫法對照表

     編輯:關於SqlServer

一張表掌握 SQL Server / Oracle / MySQL / PostgreSQL / Access 隨機取 N 筆

隨機抽樣是 A/B 測試、推薦系統、審核抽查的常見需求。各資料庫語法差異極大,本文整理標準寫法與效能備註。

核心語法對照

資料庫語法範例(取 50 筆)效能備註
SQL ServerORDER BY NEWID()SELECT TOP 50 * FROM TAB_USERS ORDER BY NEWID();全表掃描 + 排序,大表慎用
OracleDBMS_RANDOM.VALUE + 子查詢SELECT * FROM (SELECT * FROM TAB_USERS ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 50;同樣全表排序
MySQLORDER BY RAND()SELECT * FROM TAB_USERS ORDER BY RAND() LIMIT 50;臨時表 + filesort,極慢
PostgreSQLORDER BY RANDOM()SELECT * FROM TAB_USERS ORDER BY RANDOM() LIMIT 50;同 MySQL
AccessORDER BY RND(欄位)SELECT TOP 50 * FROM TAB_USERS ORDER BY RND(id);需傳入正數種子

大表高效能隨機抽樣替代方案

  1. Bernoulli 抽樣(系統抽樣):
    -- SQL Server (TABLESAMPLE 10 PERCENT)
    SELECT * FROM TAB_USERS TABLESAMPLE (10 PERCENT) REPEATABLE (12345);
    • 頁面級抽樣,極快但非精確行數、可能有叢集偏差。
  2. 主鍵範圍 + 隨機偏移(適用連續整數 PK):
    -- 先取 MAX(id),再在應用層產生隨機 ID 清單,最後 WHERE id IN (...)
  3. 預先產生隨機排序欄位:
    • 表新增 rand_sort INT,定期批次更新 rand_sort = RAND() * 2147483647,查詢時 ORDER BY rand_sort 瞬間完成。

Access 後端程式碼特別處理

Access SQL 中 RND([欄位]) 需傳入正數種子,ASP.NET 後端需動態生成:

var rnd = new Random(Guid.NewGuid().GetHashCode());
int seed = rnd.Next();
string sql = $"SELECT TOP 50 * FROM TAB_USERS ORDER BY RND({seed} * [id])";

總結建議

  • 小表(< 1 萬列)→ 直接 ORDER BY RAND()/NEWID()/RANDOM()。
  • 中大表 → TABLESAMPLE / 主鍵範圍抽樣 / 預計算隨機欄位。
  • 嚴格統計隨機 → 應用層抽樣演算法(Reservoir Sampling)而非 SQL 排序。

根據資料量與精確度需求選擇適當策略,避免 ORDER BY RAND() 癱瘓生產庫。

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