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

MSSQL 實現隨機讀取與排序的兩種高效寫法

     編輯:關於SqlServer

需求背景

在 CMS 系統或推薦模組中,常需從資料表隨機抽取 N 筆資料供前端展示。本文記錄兩種在 MSSQL 中實現隨機排序的實用寫法,並解析其原理。

寫法一:利用 RND 與時間種子的複合函數(KingCMS 實戰範例)

以下為 KingCMS 模板標籤中的實際 SQL 片段,從 kingart 表隨機取 15 筆顯示文章:

SELECT TOP 15 artid, arttitle, artpath, artdescription, artshow
FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY RIGHT(CSTR(RND(-INT(RND(-TIMER())*100+artid)))*1000*NOW()), 2)

核心邏輯解析:

  • TIMER() 取得當前時間作為種子基礎
  • RND(-INT(RND(...)*100+artid)) 結合主鍵 artid 產生唯一隨機值
  • RIGHT(..., 2) 取右側兩位數字作為最終排序依據

此寫法在 Access/MSSQL 混合環境下相容性較好,但函數嵌套較深,大數據量時效能稍弱。

寫法二:簡潔的 RND(主鍵) 降冪排序

SELECT TOP 15 * FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY RND(artid) DESC;

優點:語法簡潔、可讀性強、利用主鍵確保每行種子不同。

注意: MSSQL 原生不支援 RND() 函數,此寫法適用於支援 VBA 函數的環境(如 Access、KingCMS 內建解析器)。純 MSSQL 環境請參考下文補充方案。

補充:純 T-SQL 標準隨機排序方案

若在標準 SQL Server 環境,推薦使用 NEWID() 或 CHECKSUM(NEWID()):

-- 方案 A:NEWID()(唯一識別碼排序,資源較大)
SELECT TOP 15 * FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY NEWID();

-- 方案 B:CHECKSUM(NEWID())(整數運算,效能更佳)
SELECT TOP 15 * FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY CHECKSUM(NEWID());

效能建議

  1. 小數據量(< 1 萬筆):ORDER BY NEWID() 簡單可靠。
  2. 大數據量:建議先抽樣再排序,或使用 TABLESAMPLE、RAND() 配合主鍵篩選。
  3. 避免在高頻 API 中直接對大表做全表隨機排序,考慮快取或預計算隨機權重欄位。

小結

隨機讀取在內容推薦、廣告輪播等場景極為常見。根據資料庫引擎與數據規模選擇合適方案,兼顧開發效率與執行效能。

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