ALTER PARTITION FUNCTION (Transact-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 會決定新資料分割的範圍,它必須不同於資料分割函數的現有界限範圍。Database Engine 會以 boundary_value 為基礎,將現有的一個範圍分割成兩個。在這兩個範圍中,新 boundary_value 所在的範圍視為新的資料分割。

    重要注意事項重要事項

    線上必須有檔案群組存在,且使用資料分割函數的資料分割結構描述必須將它標示為 NEXT USED,以便存放新的資料分割。您可以在 CREATE PARTITION SCHEME 陳述式中,將檔案群組配置給資料分割。如果 CREATE PARTITION SCHEME 陳述式配置的檔案群組超出需要 (CREATE PARTITION FUNCTION 陳述式所建立的資料分割數,比用來存放它們的檔案群組少),就會有未指派的檔案群組,資料分割結構描述會將其中一個標示為 NEXT USED。這個檔案群組將存放新的資料分割。如果沒有資料分割結構描述標示為 NEXT USED 的檔案群組,您就必須利用 ALTER PARTITION SCHEME 來加入檔案群組,或指定現有的檔案群組,來存放新的資料分割。您可以指定已存放資料分割的檔案群組來存放其他資料分割。由於資料分割函數可以參與多項資料分割結構描述,因此,所有使用要新增資料分割之資料分割函數的資料分割結構描述,都必須有 NEXT USED 檔案群組。否則,ALTER PARTITION FUNCTION 會失敗,且會出現一則錯誤,顯示一或多個缺少 NEXT USED 檔案群組的資料分割結構描述。

  • MERGE [ RANGE ( boundary_value) ]
    卸除一份資料分割,將這份資料分割中的任何值合併到其餘某份資料分割中。RANGE (boundary_value) 必須是現有的界限值,已卸除之資料分割中的值會合併到其中。除非有其餘資料分割使用最初保留 boundary_value 的檔案群組,或這個檔案群組已用 NEXT USED 屬性來標示,否則,會從資料分割結構描述中移除它。合併的資料分割放在最初並未存放 boundary_value 的檔案群組中。boundary_value 是一個可以參考變數 (包括使用者自訂類型變數) 或函數 (包括使用者自訂函數) 的常數運算式。它不能參考 Transact-SQL 運算式。boundary_value 必須符合對應資料分割資料行的資料類型,或可以隱含地轉換成這個資料類型,且在隱含地轉換期間,不能因為值的大小和小數位數不符合對應 input_parameter_type 的大小和小數位數而被截斷。

備註

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

ALTER PARTITION FUNCTION 只能用來將一份資料分割分成兩份,或將兩份資料分割合併成一份。若要變更資料表的分割方式 (例如,從 10 份資料分割到 5 份資料分割),您可以練習任何下列選項。這些選項的資源消耗程度各異,會隨著系統的組態而不同:

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

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

    [!附註]

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

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

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

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

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

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

權限

下列中的任何權限都可用來執行 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);