首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL Server 分區表轉普通表:不丟失資料的標準轉換流程

     編輯:程式設計疑難解答

已建立分區表 (Partitioned Table) 需移除分區功能,回歸普通堆疊表或叢集索引表,**資料完全保留**。

核心原理

分區表本質是將資料水平切分到多個檔案群組。轉換為普通表 = **合併所有分區到單一檔案群組**,並移除分區函數/配置綁定。

標準 T-SQL 轉換步驟 (SQL Server 2008+)

-- 1. 建立目標檔案群組 (若無) 或使用 PRIMARY
-- ALTER DATABASE MyDB ADD FILEGROUP FG_Standard;
-- ALTER DATABASE MyDB ADD FILE (NAME='FG_Standard', FILENAME='...') TO FILEGROUP FG_Standard;

-- 2. 移除分區配置綁定 (將所有資料移到單一 FG)
ALTER TABLE dbo.PartitionedTable
DROP CONSTRAINT PK_PartitionedTable  -- 若 PK 含分區欄位需先刪除
WITH (MOVE TO FG_Standard);          -- 關鍵:MOVE TO 指定目標 FG

-- 3. 重建索引/主鍵到標準 FG
ALTER TABLE dbo.PartitionedTable
ADD CONSTRAINT PK_PartitionedTable PRIMARY KEY (Id) ON FG_Standard;

-- 4. (選擇性) 刪除分區函數/配置 (若無其他表使用)
DROP PARTITION SCHEME MyPartitionScheme;
DROP PARTITION FUNCTION MyPartitionFunction;

關鍵點

  • MOVE TO FG_Standard 會觸發資料移動,**資料不會刪除**,只是重新分配頁面。
  • 若表有 **叢集索引** 且包含分區欄位,必須先 `DROP` 再 `CREATE` 到新 FG。
  • 操作期間會鎖表,建議維護視窗執行,大表預估時間 = 資料量 / (IOPS × 0.7)。
  • 轉換後 `sys.partitions` 該表 `partition_number` 全為 1,`data_space_id` 指向目標 FG。

驗證腳本

SELECT 
    t.name AS TableName,
    p.partition_number,
    fg.name AS FileGroupName,
    p.rows
FROM sys.tables t
JOIN sys.partitions p ON t.object_id = p.object_id
JOIN sys.allocation_units au ON p.hobt_id = au.container_id
JOIN sys.filegroups fg ON au.data_space_id = fg.data_space_id
WHERE t.name = 'PartitionedTable';
-- 結果應只有一列 partition_number=1

替代方案:建新表複製

若不想鎖表太久:

  1. `SELECT * INTO NewTable FROM PartitionedTable;` (在目標 FG 建立,需先 `SET PARTITION SCHEME` 或用 `CREATE TABLE ... ON FG_Standard`)。
  2. 建立索引、FK、權限。
  3. 重命名交換:`sp_rename 'PartitionedTable', 'PartitionedTable_Old'; sp_rename 'NewTable', 'PartitionedTable';`
  4. 驗證無誤後刪除舊表。

採用 `ALTER TABLE ... MOVE TO` 官方標準路徑最省時、資料零風險;大表可用「建新表複製+重命名」降低鎖定影響。

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