分享方式:


ALTER PARTITION FUNCTION (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體

藉由分割或合併資料分割函數的界限值來變更資料分割函數。 執行 ALTER PARTITION FUNCTION 陳述式,可將一個使用資料分割函數的資料表或索引分割區分割為兩個分割區。 此陳述式也可以將兩個分割區合併成一個分割區。

警告

多份資料表或索引可以使用相同的資料分割函數。 ALTER PARTITION FUNCTION 會在單一交易中影響所有的資料表或索引。

Transact-SQL 語法慣例

語法

  
ALTER PARTITION FUNCTION partition_function_name()  
{   
    SPLIT RANGE ( boundary_value )  
  | MERGE RANGE ( boundary_value )   
} [ ; ]  

引數

partition_function_name
這是您要修改的資料分割函數名稱。

SPLIT RANGE ( boundary_value )
將一個資料分割加入資料分割函數。 boundary_value 會決定新資料分割的範圍,而此範圍必須不同於資料分割函數現有的界限範圍。 根據 boundary_value,資料庫引擎會將現有的一個範圍分割成兩個。 在這兩個範圍中,具有新 boundary_value 的範圍是新的分割區。

線上必須有檔案群組存在。 而且,使用資料分割函數作為 NEXT USED 以保存新分割區的資料分割配置必須標示檔案群組。 CREATE PARTITION SCHEME 陳述式會將檔案群組指派給分割區。 CREATE PARTITION FUNCTION 陳述式會建立少於檔案群組數目的分割區數目以利保存。 CREATE PARTITION SCHEME 陳述式所保留的檔案群組數目可能比所需的還多。 如果發生這種情況,則您最終將不會獲指派檔案群組。 此外,資料分割配置會將其中一個檔案群組標示為 NEXT USED。 這個檔案群組會保存新的分割區。 如果沒有資料分割配置標示為 NEXT USED 的檔案群組,則您必須使用 ALTER PARTITION SCHEME 陳述式。

ALTER PARTITION SCHEME 陳述式可以新增檔案群組或選取現有的檔案群組,來保存新的分割區。 您可以指定已經保存分割區的檔案群組來保存其他分割區。 資料分割函數可以參與多個資料分割配置。 基於這個理由,使用您要新增分割區之資料分割函數的所有資料分割配置都必須具有 NEXT USED 檔案群組。 否則,ALTER PARTITION FUNCTION 陳述式就會失敗並出現一則錯誤,顯示一個或多個缺少 NEXT USED 檔案群組的資料分割配置。

如果您在相同的檔案群組中建立所有資料分割,會在一開始時自動將該檔案群組指派為 NEXT USED 檔案群組。 但在分割作業執行之後,即不再有選取的 NEXT USED 檔案群組。 使用 ALTER PARTITION SCHEME 來將檔案群組明確指派為 NEXT USED 檔案群組,否則後續的分割作業將會失敗。

注意

資料行存放區索引的限制:當資料表上存在資料行存放區索引時,僅可分割空的資料分割。 執行此作業之前,您必須先卸除或停用資料行存放區索引。

MERGE [ RANGE ( boundary_value) ]
卸除分割區,並將該分割區中現有的所有值合併到剩餘的分割區中。 RANGE (boundary_value) 必須是待捨棄分割區的現有界限值。 除非有剩餘的分割區會使用最初保存 boundary_value 的檔案群組,或者已用 NEXT USED 屬性來標示這個檔案群組,否則,此引數會從資料分割配置中移除該檔案群組。 合併的分割區存在於一開始未保存 boundary_value 的檔案群組中。 boundary_value 是可以參考變數 (包括使用者定義型別變數) 或函數 (包括使用者自訂函數) 的常數運算式。 無法參考 Transact-SQL 運算式。 boundary_value 必須完全符合或可隱含轉換成其對應分割資料行的資料類型。 您也無法以值的大小和小數位數不符合其對應 input_parameter_type 之值的方式,在隱含轉換期間截斷 boundary_value

注意

資料行存放區索引的限制:包含資料行存放區索引的兩個非空白分割區無法合併。 在執行此作業之前,您必須卸除或停用資料行存放區索引

最佳做法

一律在分割區範圍的兩端保留空的分割區。 在這兩端保留分割區,以確保分割區會分割,而且分割區合併不會產生任何資料移動。 分割區分割會在一開始發生,而分割區合併會在結束時發生。 請避免分割或合併已擴展的資料分割。 分割或合併已擴展的分割區有時候很沒效率。 之所以缺乏效率,是因為分割與合併有時能使記錄產生作業延長四倍以上,也可能造成嚴重鎖定。

將分割區放在多個檔案群組的主要理由是可以確保能夠對分割區獨立執行備份與還原作業。 深入了解檔案群組中的檔案群組和資料分割策略。

限制事項

ALTER PARTITION FUNCTION 會在單一不可部分完成的作業中,重新分割任何使用函數的資料表和索引。 不過,這項作業是離線進行的,可能非常需要資源,這會隨著重新分割的範圍而不同。

只使用 ALTER PARTITION FUNCTION 來將一個分割區分成兩個,或將兩個分割區合併成一個。 若要變更資料表的分割方式 (例如,從 10 個分割區到五個分割區),請練習下列任意選項。 這些選項的資源耗用程度各異,可能會隨著系統的設定而不同:

  • 使用所需的資料分割函數來建立新的資料分割資料表。 然後,使用 INSERT INTO...SELECT FROM 陳述式,將舊資料表的資料插入新的資料表。

  • 建立堆積的資料分割叢集索引。

    注意

    卸除資料分割叢集索引會產生資料分割堆積。

  • 利用設定了 DROP EXISTING = ON 子句的 Transact-SQL CREATE INDEX 陳述式來卸除和重建現有的資料分割索引。

  • 執行 ALTER PARTITION FUNCTION 陳述式的序列。

ALTER PARTITION FUNCTION 所影響的所有檔案群組都必須在線上。

當使用資料分割函數的任何資料表上有已停用的叢集索引時,ALTER PARTITION FUNCTION 就會失敗。

資料庫引擎不提供修改資料分割函數的複寫支援。 您必須在訂閱資料庫中,手動套用發行集資料庫中的資料分割函數變更。

權限

下列中的任何權限都可用來執行 ALTER PARTITION FUNCTION:

  • ALTER ANY DATASPACE 權限。 這個權限預設會授與 sysadmin 固定伺服器角色以及 db_ownerdb_ddladmin 固定資料庫角色的成員。

  • 對於建立資料分割函數之資料庫的 CONTROL 或 ALTER 權限。

  • 對於建立資料分割函數之資料庫伺服器的 CONTROL SERVER 或 ALTER ANY DATABASE 權限。

範例

A. 將資料分割或分割資料表或索引的分割分成兩個資料分割

下列範例會建立一個資料分割函數,將資料表或索引分割成四個資料分割。 ALTER PARTITION FUNCTION 會將其中一個資料分割分成兩個,以建立總計五個的資料分割。

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Split the partition between boundary_values 100 and 1000  
--to create two partitions between boundary_values 100 and 500  
--and between boundary_values 500 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
SPLIT RANGE (500);  

B. 將分割資料表的兩個資料分割合併成一個資料分割

下列範例會建立上述中的相同資料分割函數,再將兩份資料分割合併成一份資料分割,總共三份的資料分割。

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Merge the partitions between boundary_values 1 and 100  
--and between boundary_values 100 and 1000 to create one partition  
--between boundary_values 1 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
MERGE RANGE (100);  

下一步

在下列文章中深入了解資料表資料分割與相關概念: