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

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

     編輯:關於SqlServer

隨機抽樣核心挑戰

關聯式資料庫預設無序,需引入隨機排序機制。大表全表排序代價高昂,各資料庫提供不同語法與效能特性。

語法對照表

資料庫語法範例 (取 20 筆)機制說明效能備註
SQL ServerSELECT TOP 20 * FROM 表 ORDER BY NEWID();NEWID() 產生 GUID 排序全表掃描 + 排序,大表極慢;建議配合 TABLESAMPLE (近似抽樣) 或主鍵範圍隨機
AccessSELECT TOP 20 * FROM 表 ORDER BY Rnd(Id);Rnd(數值欄位) 產生偽隨機數同樣全表排序;Id 可為任何數值/自動編號欄位
MySQLSELECT * FROM 表 ORDER BY RAND() LIMIT 20;RAND() 每列產生 0~1 浮點數排序全表排序,大表災難;優化見下文
PostgreSQLSELECT * FROM 表 ORDER BY RANDOM() LIMIT 20;RANDOM() 同 MySQL同樣全表排序;支援 TABLESAMPLE BERNOULLI/SYSTEM
OracleSELECT * FROM (SELECT * FROM 表 ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 20;DBMS_RANDOM.VALUE 產生隨機值全表排序;12c+ 支援 SAMPLE 子句
DB2SELECT * FROM 表 ORDER BY RAND() FETCH FIRST 20 ROWS ONLY;RAND() 標量函數全表排序;支援 TABLESAMPLE

大表隨機抽樣優化策略

1. 近似抽樣 (TABLESAMPLE / SAMPLE)

-- SQL Server (資料頁層級抽樣,非逐列)
SELECT * FROM 表 TABLESAMPLE (10 PERCENT) REPEATABLE (12345);

-- PostgreSQL
SELECT * FROM 表 TABLESAMPLE BERNOULLI (10) REPEATABLE (12345);

-- Oracle 12c+
SELECT * FROM 表 SAMPLE (10);
  • **優點**:極快,僅掃描抽中頁面/區塊。
  • **缺點**:非精確逐列隨機;結果筆數不固定;REPEATABLE 種子可復現。

2. 主鍵範圍隨機 (適用連續/近似連續 PK)

-- 取得 PK 範圍
DECLARE @MinID INT, @MaxID INT, @RandomID INT;
SELECT @MinID = MIN(Id), @MaxID = MAX(Id) FROM 表;
SET @RandomID = @MinID + CAST(RAND() * (@MaxID - @MinID) AS INT);

-- 取大於等於隨機 ID 的前 N 筆 (需 PK 索引)
SELECT TOP 20 * FROM 表 WHERE Id >= @RandomID ORDER BY Id;
  • **優點**:索引 Seek 定位,毫秒級回應。
  • **缺點**:PK 有間隙/刪除時分布不均;需配合 NEWID() 多次隨機起點取樣並 UNION 去重。

3. 系統版本/變更追蹤表隨機 (SQL Server 2016+)

利用 sys.dm_db_stats_histogram 統計直方圖步驟值作為隨機起點,提升代表性。

最佳實務建議

  1. **小表 (< 10 萬列)**:直接 ORDER BY RAND()/NEWID() 簡單可行。
  2. **中大表**:優先 **TABLESAMPLE** 近似抽樣,或 **主鍵範圍隨機 + 索引 Seek**。
  3. **統計分析/訓練資料集**:使用 REPEATABLE 種子確保可重現性。
  4. **避免在 OLTP 核心交易中使用隨機排序**,將抽樣邏輯下推至報表/分析資料庫 (資料倉儲/唯讀副本)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved