ALTER PARTITION FUNCTION (Transact-SQL)
藉由分割或合併資料分割函數的界限值來變更資料分割函數。 您可以執行 ALTER PARTITION FUNCTION,將使用資料分割函數的任何資料表或索引的一份資料分割分成兩份資料分割,或將兩份資料分割合併成一份較小的資料分割。
注意 |
---|
多份資料表或索引可以使用相同的資料分割函數。 ALTER PARTITION FUNCTION 會在單一交易中影響所有的資料表或索引。 |
語法
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 檔案群組的資料分割結構描述。
如果您在相同的檔案群組中建立所有資料分割,會在一開始時自動將該檔案群組指派為 NEXT USED 檔案群組。 但執行分割作業之後,即不會再有指定的 NEXT USED 檔案群組。 您必須使用 ALTER PARITION 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 的大小與小數位數而被截斷。
最佳作法
請務必在資料分割範圍的兩端保留空白的資料分割,確保資料分割 (載入新資料之前) 和資料分割合併 (卸載舊資料之後) 不會產生任何資料移動。 請避免分割或合併已擴展的資料分割。 因為這樣做可能會導致記錄產生作業延長四倍以上,也可能會造成嚴重鎖定,所以可能非常沒有效率。
限制事項
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 不提供修改資料分割函數的複寫支援。 您必須在訂閱資料庫中,手動套用發行集資料庫中的資料分割函數變更。
權限
下列中的任何權限都可用來執行 ALTER PARTITION FUNCTION:
ALTER ANY DATASPACE 權限。 這個權限預設會授與系統管理員 (sysadmin) 固定伺服器角色,以及 db_owner 和 db_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);
請參閱
參考
CREATE PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
DROP PARTITION SCHEME (Transact-SQL)
sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL)
sys.partition_range_values (Transact-SQL)
sys.index_columns (Transact-SQL)