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

SQL Server 全域暫存表進階:啟動預存程序建立持久化 ##GlobalTempTable

     編輯:關於SqlServer

突破 Session 生命週期:建立「永不消失」的全域暫存表

一般全域暫存表 (`##Table`) 隨**建立它的 Session 結束而自動刪除**。若需一個**跨 Session、跨重啟、僅手動 DROP 才移除**的全域暫存表,可結合 **啟動預存程序 (Startup Procedure)** 實現。

核心機制

  • 在 `master` 資料庫建立 `sp_` 開頭的預存程序。
  • 標記為啟動程序:`EXEC sp_procoption 'dbo.sp_Globals', 'startup', 'true';`
  • SQL Server 啟動時自動執行該程序,**在系統 Session 內建立 `##Globals`**。
  • 系統 Session 永不結束 → **引用計數器 > 0** → SQL Server 不會嘗試自動清除該全域暫存表。
  • 除非顯式 `DROP TABLE ##Globals`,否則跨所有使用者 Session 可見、持久存在。

完整部署腳本

USE master;
GO

IF OBJECT_ID('dbo.sp_Globals') IS NOT NULL
    DROP PROC dbo.sp_Globals;
GO

CREATE PROC dbo.sp_Globals
AS
BEGIN
    CREATE TABLE ##Globals
    (
        id VARCHAR(36) NOT NULL PRIMARY KEY,
        value VARCHAR(500)
    );
END;
GO

-- 標記為啟動程序
EXEC dbo.sp_procoption 'dbo.sp_Globals', 'startup', 'true';
GO

驗證與使用

  1. 執行上述腳本 → 重啟 SQL Server 服務。
  2. 任意 Session 執行 `SELECT * FROM ##Globals;` → 可見表結構。
  3. 寫入資料:`INSERT INTO ##Globals VALUES (NEWID(), '跨 Session 共享配置');`
  4. 另開 Session 讀取:`SELECT * FROM ##Globals;` → 看得到剛寫入的資料。
  5. 重啟 SQL Server → 表自動重建(資料遺失,僅結構保留)。

適用場景

  • **全域配置快取**:應用啟動時載入設定至 `##Globals`,所有連線共享讀取,避免重複查表。
  • **跨 Session 協調旗標**:ETL 流程控制旗標、鎖標記、進度追蹤。
  • **暫存大型中間結果**:多個預存程序/作業分階段處理同一批資料,避免重複落地實體表。

⚠️ 風險與限制

風險對策
資料隨服務重啟遺失僅存可重算/可重載的暫態資料;關鍵資料落地實體表
佔用 tempdb 空間監控 `tempdb` 使用量,定期清理過期資料
並發寫入衝突主鍵約束 + 應用層邏輯協調;必要時用 `sp_getapplock`
安全性:所有登入用戶可見敏感資料勿存;或改用 `CONTEXT_INFO`/`SESSION_CONTEXT` 隔離
啟動程序失敗導致 SQL 啟動延遲程式碼極簡化、加 `TRY/CATCH`、記錄錯誤到 `ERRORLOG`

替代方案比較

方案持久性隔離性效能維護
啟動程序 + ##GlobalTempTable服務重啟保留結構無 (全域可見)極高 (tempdb 記憶體優化)低 (自動重建)
實體表 + 定時清理作業永久可控 (權限/Schema)中 (磁碟 I/O)中 (需清理排程)
Memory-Optimized Table (Hekaton)永久 (耐久性可選)可控最高 (無鎖)高 (記憶體容量規劃)
Application Cache (Redis/IMemoryCache)視基礎設施Key 隔離高 (網路跳數)中 (額外元件)

結語

啟動預存程序 + `##GlobalTempTable` 是 **零成本、高效能、自動重建** 的跨 Session 暫存共享方案。用對場景(配置快取、協調旗標、中間結果),能大幅簡化架構;切記**資料不持久、權限全開**,敏感業務勿用。

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