SQL Server (T-SQL)
-- 簡單隨機 N 筆
SELECT TOP (10) * FROM dbo.BigTable ORDER BY NEWID();
-- 大表效能優化:TABLESAMPLE (近似隨機,頁面層級)
SELECT * FROM dbo.BigTable TABLESAMPLE (10 PERCENT); -- 不保證筆數
-- 精確隨機 + 效能:Beroulli 抽樣 (SQL 2005+)
SELECT * FROM dbo.BigTable
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), ID) & 0x7fffffff AS FLOAT) / 0x7fffffff; -- 約 1%
MySQL / MariaDB
-- 簡單隨機
SELECT * FROM big_table ORDER BY RAND() LIMIT 10;
-- 大表優化:隨機 ID 範圍
SELECT * FROM big_table
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM big_table)))
ORDER BY id LIMIT 10;
PostgreSQL
-- 簡單隨機
SELECT * FROM big_table ORDER BY RANDOM() LIMIT 10;
-- 系統抽樣 (近似,極快)
SELECT * FROM big_table TABLESAMPLE BERNOULLI (1); -- 1%
-- 區塊抽樣 (更快,但可能偏態)
SELECT * FROM big_table TABLESAMPLE SYSTEM (1);
Oracle
-- 簡單隨機
SELECT * FROM (
SELECT * FROM big_table ORDER BY DBMS_RANDOM.VALUE
) WHERE ROWNUM <= 10;
-- 區塊抽樣 (近似)
SELECT * FROM big_table SAMPLE BLOCK (1); -- 1% 區塊
-- 列抽樣 (近似)
SELECT * FROM big_table SAMPLE (1);
Access (JET/ACE)
-- VBA/查詢中
Dim r As Single: Randomize: r = Rnd
SELECT TOP 10 * FROM big_table ORDER BY Rnd(r * ID);
SQLite
SELECT * FROM big_table ORDER BY RANDOM() LIMIT 10;
大表隨機抽樣效能策略對比
| 策略 | 精確度 | 效能 | 適用場景 |
| ORDER BY RAND/NEWID | 精確 | 極差 (全表排序) | 小表 < 10 萬 |
| TABLESAMPLE SYSTEM | 近似 (頁面/區塊) | 極佳 | 大表、統計分析、不需精確筆數 |
| TABLESAMPLE BERNOULLI | 近似 (列級) | 佳 | 大表、統計分析 |
| 隨機 ID 範圍 | 精確 | 良 (需連續 ID) | 大表、ID 連續無大間隙 |
| CHECKSUM 抽樣 | 精確 (機率) | 良 | 大表、需精確筆數、無連續 ID |
選型建議
- 報表/統計分析 →
TABLESAMPLE (系統/伯努利)
- 功能需精確 N 筆 (如抽獎) →
ORDER BY NEWID() 小表 / CHECKSUM 大表
- ID 連續且無大洞 → 隨機 ID 範圍 +
TOP/LIMIT
- 永遠先看執行計畫,確認無 Sort/Table Spool