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

SQL Server 暫存表與資料表變數差異深度解析

     編輯:關於SqlServer

核心差異速查表

特性暫存表 (# / ##)資料表變數 (@)
儲存位置tempdb(實體頁面,可交換到磁碟)tempdb(記憶體優先,壓力大時溢寫磁碟)
作用域連線層級(區域)或全域(##)批次/程序層級,離開批次即銷毀
統計資料自動建立/更新,支援重編譯無統計資料(預估 1 列),不觸發重編譯
索引/約束支援所有 DDL(PK、FK、Unique、Check、預設值)僅宣告時定義 PK/Unique,事後不可 ALTER
交易記錄完整記錄,支援 Rollback僅記錄中繼資料,Rollback 不影響資料
平行處理支援平行查詢不支援平行計畫(串行)
參數傳遞不可作為參數傳入預存程序可作為參數(READONLY)傳入

選擇指南

  • 大量資料、需索引/統計、複雜查詢、平行化 → 暫存表
  • 小資料集、簡單暫存、需傳遞給預存程序、避免重編譯 → 資料表變數

暫存表進階操作範例

CREATE TABLE #News (
    News_id INT NOT NULL,
    NewsTitle VARCHAR(100),
    NewsContent VARCHAR(2000),
    NewsDateTime DATETIME
);

-- 動態加入 PK、預設值
ALTER TABLE #News ADD CONSTRAINT PK_News PRIMARY KEY CLUSTERED (News_id);
ALTER TABLE #News ADD CONSTRAINT DF_NewsDateTime DEFAULT (GETDATE()) FOR NewsDateTime;

-- 全域暫存表範例
IF OBJECT_ID('tempdb..##wzg_test') IS NOT NULL DROP TABLE ##wzg_test;
CREATE TABLE ##wzg_test (id INT, name VARCHAR(100));
INSERT INTO ##wzg_test VALUES (1, 'wzh');
SELECT * FROM ##wzg_test;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved