Partition:分區切換(Switch)

来源:http://www.cnblogs.com/ljhdo/archive/2016/12/01/5040150.html
-Advertisement-
Play Games

在SQL Server中,對超級大表做數據歸檔,使用select和delete命令是十分耗費CPU時間和Disk空間的,SQL Server必須記錄相應數量的事務日誌,而使用switch操作歸檔分區表的老數據,十分高效,switch操作不會移動數據,只是做元數據的置換,因此,執行分區切換操作的時間是 ...


在SQL Server中,對超級大表做數據歸檔,使用select和delete命令是十分耗費CPU時間和Disk空間的,SQL Server必須記錄相應數量的事務日誌,而使用switch操作歸檔分區表的老數據,十分高效,switch操作不會移動數據,只是做元數據的置換,因此,執行分區切換操作的時間是非常短暫的,幾乎是瞬間完成,但是,在做分區切換時,源表和靶表必須滿足一定的條件:

  • 表的結構相同:列的數據類型,可空性(nullability)相同;
  • 索引結構必須相同:索引鍵的結構,聚集性,唯一性,列的可空性必須相同;
    • 主鍵約束:如果源表存在主鍵約束,那麼靶表必須創建等價的主鍵約束;
    • 唯一約束:唯一約束可以使用唯一索引來實現;
    • 索引鍵的結構:索引鍵的順序,包含列,唯一性,聚集性都必須相同;
  • 存儲的數據空間(data space)相同:源表和靶表必須創建在相同的FileGroup或Partition Scheme上;

分區切換是將源表中的一個分區,切換到靶表(target_table)中,靶表可以是分區表,也可以不是分區表,switch操作的語法是:

ALTER TABLE schema_name . table_name 
SWITCH [ PARTITION source_partition_number_expression ]
TO target_table  [ PARTITION target_partition_number_expression ]

一,創建示例數據

-- create parition function
create partition function pf_int_left (int)
as range left 
for values (10,20);

--create partition scheme
create partition scheme ps_int_left
as 
partition pf_int_left
all to ([primary]);

--create partitioned table
create table dbo.dt_partition
(
ID int null,
Code int null
)
on ps_int_left (id)

--Create staging table
create table dbo.dt_SwitchStaging
(
ID int null,
Code int null
)
on [primary]
View Code

創建靶表 dt_SwitchStaging,用於存儲分區表的數據

二,源表和目標表的結構必須相同

1,數據列的可空性必須相同(nullability)

由於靶表的ID列是非空的(not null),源表的ID列是可空的(null),可空性不同,在切換分區時,SQL Server會拋出錯誤消息:

alter table dbo.dt_SwitchStaging
alter column ID int not null;

--swith partition 2 to staging table
alter table dbo.dt_partition
switch partition 2 
to dbo.dt_SwitchStaging

ALTER TABLE SWITCH statement failed because column 'ID' does not have the same nullability attribute in tables 'dbo.dt_partition' and 'dbo.dt_SwitchStaging'.

2,數據列的數據類型必須相同

在執行分區切換時,源表和靶表的數據類型必須相同,即使數據類型相相容,SQL Server會拋出錯誤消息:

alter table  dbo.dt_SwitchStaging
alter column ID bigint null

ALTER TABLE SWITCH statement failed because column 'ID' has data type int in source table 'dbo.dt_partition' which is different from its type bigint in target table 'dbo.dt_SwitchStaging'.

三,隱式的Check約束,實現分區的可空屬性

分區列(Partition Column)允許為NULL,SQL Server在分區時,將NULL值作為最小值,存儲在最左邊的第一個分區中,其Partition Number是1。

Any data with a NULL in the partition column will reside in the leftmost partition. NULL is considered smaller than the minimum value of the data type’s values.

分區函數(Partition Function)定義分區列(Partition Column)在每一個分區的取值區間(Value Range),在SQL Server內部,取值區間是使用Check約束來實現的,每一個Partition都有一個check 約束,用於限定Partition column的取值範圍:

  • Partition Number=1,Partition column允許存在null;
  • 其他Partition,Partition column不允許存在null;

對於Unknown值,Check約束認為邏輯結果是True,例如,check(ID>1 and ID<10), 如果ID=Null,那麼表達式ID>1 and ID<10 返回Unknown(或null),但是,Check約束返回的結果是True,即不違反check約束。

四,表的索引結構必須相同,唯一性和聚集性也必須相同

在執行分區切換時,表的索引結構,唯一性和聚集性必須相同,在SQL Server中,使用unique index 實現unique 約束的唯一性。

1,索引的聚集性

在分區表上創建一個聚集索引(clustered index),在切換分區時,SQL Server拋出錯誤信息,要求靶表必須創建聚集索引

--create clustered index
create clustered index cix_dt_partition_ID
on dbo.dt_partition(ID)

ALTER TABLE SWITCH statement failed. The table 'dbo.dt_partition' has clustered index 'cix_dt_partition_ID' while the table 'dbo.dt_SwitchStaging' does not have clustered index.

2,唯一約束

在分區表上創建唯一聚集約束(unique clustered),在切換分區時,SQL Server拋出錯誤消息,要求靶表必須創建唯一索引

alter table dbo.dt_partition
add constraint UQ__dt_partition_ID_Code
unique clustered(ID,Code)

ALTER TABLE SWITCH statement failed. The table 'dbo.dt_partition' has clustered index 'UQ__dt_partition_ID_Code' while the table 'dbo.dt_SwitchStaging' does not have clustered index.

Workaround1:在靶表上創建唯一聚集索引(unique clustered),而不是創建unique clustered 約束,switch 成功;

--create unique clustered index
create unique clustered index ucix_dt_SwitchStaging_ID_Code
on dbo.dt_SwitchStaging(ID,Code)

Workaround2:在靶表上創建unique clustered 約束,switch 成功;

3,主鍵約束

在創建Primary key 約束時,主鍵列是不可空的

--drop table
drop table dbo.dt_partition
go
drop table dbo.dt_SwitchStaging
GO
--create partitioned table
create table dbo.dt_partition
(
ID int not null,
Code int null,
)
on PS_int_Left (ID)
go
--Create staging table
create table dbo.dt_SwitchStaging
(
ID int not null,
Code int null
)
on [primary]
go
View Code

為分區表創建主鍵約束,使用唯一聚集索引(unique clustered)實現,跟唯一聚集約束的唯一區別是唯一約束列允許為NULL

alter table dbo.dt_partition
add constraint PK__dt_partition_ID
primary key clustered(ID)

將分區表的第二個分區切換到靶表,SQL Server拋出錯誤信息,要求靶表必須創建唯一聚集索引,註意,不是創建聚集主鍵;

--swith partition 2 to staging table
alter table dbo.dt_partition
switch partition 2 
to dbo.dt_SwitchStaging

ALTER TABLE SWITCH statement failed. The table 'dbo.dt_partition' has clustered index 'PK__dt_partition_ID' while the table 'dbo.dt_SwitchStaging' does not have clustered index.

在靶表上創建唯一聚集索引,在執行分區切換時,SQL Server拋出錯誤消息:沒有等價的索引,這是因為聚集主鍵創建的索引是唯一的,聚集的,非空的,而唯一聚集索引是唯一的,聚集的,可空的,兩者不是完全等價的。

--create unique clustered index
create unique clustered index cix_dt_SwitchStaging_ID
on dbo.dt_SwitchStaging(ID)

ALTER TABLE SWITCH statement failed. There is no identical index in source table 'dbo.dt_partition' for the index 'cix_dt_SwitchStaging_ID' in target table 'dbo.dt_SwitchStaging' . 

在靶表上創建聚集主鍵,switch成功

--add primary key clustered constraint
alter table dbo.dt_SwitchStaging
add constraint PK__dt_SwitchStaging_ID
primary key clustered(ID)

五,總結

在執行分區操作時,要求源表和靶表必須滿足:

  • 表的結構相同:列的數據類型,可空性(nullability)相同;
  • 索引結構必須相同:索引鍵的結構,聚集性,唯一性,列的可空性必須相同;
    • 主鍵約束:如果源表存在主鍵約束,那麼靶表必須創建等價的主鍵約束;
    • 唯一約束:唯一約束可以使用唯一索引來實現;
    • 索引鍵的結構:索引鍵的順序,包含列,唯一性,聚集性都必須相同;
  • 存儲的數據空間(data space)相同:源表和靶表必須創建在相同的FileGroup或Partition Scheme上;

 

參考文檔:

ALTER TABLE (Transact-SQL)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內容開始 首先去genymotion的官網去下載其安裝文件 "資源下載" "Genymotion官網必須註冊一個賬號這個賬號安裝之後還有用的,用戶名最好用網易126郵箱註冊" 我下載的是2.8.0的版本 (註:註冊前先開個代理伺服器不然頁面打不開下載時最好用迅雷下載這樣快很 多!!!記得選擇有捆綁v ...
  • ​關於直播的技術文章不少,成體系的不多。我們將用七篇文章,更系統化地介紹當下大熱的視頻直播各環節的關鍵技術,幫助視頻直播創業者們更全面、深入地瞭解視頻直播技術,更好地技術選型。 本系列文章大綱如下: (一)採集 (二)處理 (三)編碼和封裝 (四)推流和傳輸 (五)延遲優化 (六)現代播放器原理 ( ...
  • 數據是大家的原料,在設計方案、撰寫報告之前,備料很關鍵。常言道巧婦難做無米之炊,我們今天就來聊聊如何採集數據吧。 一、數據特征 所謂時效性是指數據的發生和運用要有個提前期,失去時效性,就失去了潛在機會。 數據的分散性具體表現在兩個方面:1)沒有固定發生地。2)零散分佈,相互關聯才完整。 數據的概率性 ...
  • 1.建表及插入數據,2.使用CASE語句查詢,3.使用PIVOT行轉列,4.PIVOT動態獲取列,5.使用UNPIVOT列轉行 ...
  • 大數據架構開發 挖掘分析 Hadoop HBase Hive Storm Spark Sqoop Flume ZooKeeper Kafka Redis MongoDB 機器學習 雲計算 視頻教程 Java架構師高薪培訓 Web項目 Activiti Dubbo Redis Spring Nutch ...
  • 分析: 資料庫設計應遵循三大範式分別為: 第一範式:確保表中每列的原子性(不可拆分); 第二範式:確保表中每列與主鍵相關,而不能只與主鍵的某部分相關(主要針對聯合主鍵),主鍵列與非主鍵列遵循完全函數依賴關係(完全依賴); 第三範式:非主鍵列之間沒有傳遞函數依賴關係(消除傳遞依賴); 詳述: 第一範式 ...
  • SSDB的性能很突出,與Redis基本相當了,Redis是記憶體型,容量問題是弱項,並且記憶體成本太高,SSDB針對這個弱點,使用硬碟存儲,使用Google高性能的存儲引擎LevelDB,適合大數據量處理並把性能優化到Redis級別,具有Redis的數據結構、相容Redis客戶端,還給出了從Redis遷 ...
  • Procedure & Function Procedure 語法: Function 語法: 官網關於 procedure, function相關文檔: FAQ:http://dev.mysql.com/doc/refman/5.6/en/faqs-stored-procs.html 語法說明:h ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...