ALTER PARTITION FUNCTION (Transact-SQL)ALTER PARTITION FUNCTION (Transact-SQL)

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

境界値の分割または結合によって、パーティション関数を変更します。Alters a partition function by splitting or merging its boundary values. ALTER PARTITION FUNCTION ステートメントを実行すると、1 つのテーブル パーティションやパーティション関数を使用するインデックスを、2 つのパーティションに分割できます。Running an ALTER PARTITION FUNCTION statement can split one table partition or index that uses the partition function into two partitions. また、そのステートメントは 2 つのパーティションを 1 つのパーティションにマージすることもできます。The statement can also merge two partitions into one less partition.

注意事項

複数のテーブルやインデックスで同じパーティション関数を使用できます。More than one table or index can use the same partition function. ALTER PARTITION FUNCTION は、1 回のトランザクションでこれらすべてを操作できます。ALTER PARTITION FUNCTION affects all of them in a single transaction.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

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

引数Arguments

partition_function_namepartition_function_name
変更するパーティション関数の名前です。Is the name of the partition function to be modified.

SPLIT RANGE ( boundary_value )SPLIT RANGE ( boundary_value )
1 つのパーティションをパーティション関数に追加します。Adds one partition to the partition function. boundary_value は、新しいパーティションの範囲を決定します。boundary_value は、そのパーティション関数の既存の境界範囲と異なるようにする必要があります。boundary_value determines the range of the new partition, and must differ from the existing boundary ranges of the partition function. boundary_value に基づき、データベース エンジンDatabase Engine によって既存の範囲が 2 つに分割されます。Based on boundary_value, the データベース エンジンDatabase Engine splits one of the existing ranges into two. これらの 2 つの範囲のうち、新しい boundary_value を持つパーティションが新しいパーティションです。Of these two ranges, the one with the new boundary_value is the new partition.

ファイル グループはオンラインに存在する必要があります。A filegroup must exist online. また、新しいパーティションを保持するために、そのパーティション関数を NEXT USED として使用するパーティション構成が、そのファイルグループをマークする必要があります。And, the partition scheme that uses the partition function as NEXT USED to hold the new partition must mark the filegroup. CREATE PARTITION SCHEME ステートメントはファイルグループをパーティションに割り当てます。A CREATE PARTITION SCHEME statement assigns filegroups to partitions. CREATE PARTITION FUNCTION ステートメントは、ファイルグループよりも少ない数のパーティションを作成し、それらを保持します。The CREATE PARTITION FUNCTION statement creates fewer partitions than filegroups to hold them. CREATE PARTITION SCHEME ステートメントは、必要以上に多くのファイルグループを備えておくことがあります。A CREATE PARTITION SCHEME statement may set aside more filegroups than needed. それが発生した場合、最終的に未割り当てのファイルグループが作成されることがあります。If that happens, then you'll end up with unassigned filegroups. また、パーティション構成はそのファイルグループのいずれか 1 つを NEXT USED としてマークします。Also, the partition scheme marks one of the filegroups as NEXT USED. このファイル グループが新しいパーティションを保持します。This filegroup holds the new partition. パーティション構成が NEXT USED としてマークしたファイルグループがない場合は、ALTER PARTITION SCHEME ステートメントを使用する必要があります。If there are no filegroups the partition scheme marks as NEXT USED, you must use an ALTER PARTITION SCHEME statement.

ALTER PARTITION SCHEME ステートメントでは、新しいパーティションを保持するために、ファイルグループを追加するか、既存のファイルグループを選択できます。The ALTER PARTITION SCHEME statement can either add a filegroup, or select an existing one, to hold the new partition. 既にパーティションを保持しているファイルグループを割り当てて、追加のパーティションを保持するように指定できます。You can assign a filegroup that already holds partitions to hold additional partitions. 1 つのパーティション関数は複数のパーティション構成に参加させることができます。A partition function can participate in more than one partition scheme. この理由から、パーティションを追加する、そのパーティション関数を使用するすべてのパーティション構成に、NEXT USED ファイルグループが必要です。For this reason, all the partition schemes that use the partition function to which you're adding partitions must have a NEXT USED filegroup. ない場合、パーティション構成に NEXT USED ファイルグループが存在しないというエラーが表示され、ALTER PARTITION FUNCTION ステートメントが失敗します。Otherwise, the ALTER PARTITION FUNCTION statement fails with an error that displays the partition scheme or schemes that lack a NEXT USED filegroup.

すべてのパーティションを同じファイル グループ内に作成した場合、最初に、そのグループが自動的に NEXT USED ファイル グループに割り当てられます。If you create all the partitions in the same filegroup, that filegroup is initially assigned to be the NEXT USED filegroup automatically. ただし、分割操作が実行された後は、選択された NEXT USED ファイルグループはなくなります。However, after a split operation runs, there's no longer a selected NEXT USED filegroup. ALTER PARTITION SCHEME を使用してファイルグループを NEXT USED ファイルグループとして明示的に割り当てないと、その後の分割操作が失敗します。Explicitly assign the filegroup as the NEXT USED filegroup by using ALTER PARTITION SCHEME or an upcoming split operation will fail.

注意

列ストア インデックスに関する制限:テーブルに列ストア インデックスが存在するときは、空のパーティションのみを分割できます。Limitations with columnstore index: Only empty partitions can be split in when a columnstore index exists on the table. この操作を実行する前に、列ストア インデックスを削除するか無効にする必要があります。You will need to drop or disable the columnstore index before performing this operation.

MERGE [ RANGE ( boundary_value) ]MERGE [ RANGE ( boundary_value) ]
パーティションを削除し、そのパーティションに存在する任意の値を残りの 1 つのパーティションにマージします。Drops a partition and merges any values that exist in the partition into a remaining partition. RANGE (boundary_value) は、既存の境界値である必要があります。ここに、削除したパーティションの値がマージされます。RANGE (boundary_value) must be an existing boundary value, into which the values from the dropped partition are merged. この引数は、最初に boundary_value を保持していたファイルグループを、残りのパーティションがそれを使用しない場合、または NEXT USED プロパティでマークしない場合を除き、パーティション構成から削除します。This argument removes the filegroup that originally held boundary_value from the partition scheme unless a remaining partition uses it, or marks it with the NEXT USED property. マージされたパーティションは、最初に boundary_value を保持していなかったファイル グループに存在します。The merged partition exists in the filegroup that didn't hold boundary_value at first. boundary_value は定数式であり、変数 (ユーザー定義型変数を含む) または関数 (ユーザー定義関数を含む) を参照できます。boundary_value is a constant expression that can reference variables (including user-defined type variables) or functions (including user-defined functions). Transact-SQLTransact-SQL 式は参照できません。It can't reference a Transact-SQLTransact-SQL expression. boundary_value は、対応するパーティション分割列のデータ型と一致するか、パーティション分割列のデータ型に暗黙的に変換される必要があります。boundary_value must either match or be implicitly convertible to the data type of its corresponding partitioning column. また、明示的な変換中に、値のサイズおよびスケールが対応する input_parameter_type のものと一致しない方法で boundary_value を切り詰めることはできません。You also can't truncate boundary_value during implicit conversion in a way that the size and scale of the value doesn't match that of its corresponding input_parameter_type.

注意

列ストア インデックスに関する制限:列ストア インデックスを含む 2 つの空でないパーティションをマージすることはできません。Limitations with columnstore index: Two nonempty partitions containing a columnstore index can't be merged. この操作を実行する前に、列ストア インデックスを削除するか無効にする必要がありますYou will need to drop or disable the columnstore index before performing this operation

ベスト プラクティスBest Practices

空のパーティションは、常にパーティションの範囲の両端に保持します。Always keep empty partitions at both ends of the partition range. パーティションの分割やパーティションのマージによりデータ移動が発生しないように、パーティションを両端に保持します。Keep the partitions at both ends to guarantee that the partition split and the partition merge don't incur any data movement. パーティションの分割は最初に発生し、パーティションのマージは最後に発生します。The partition split occurs at the beginning and the partition merge occurs at the end. 設定されたパーティションが分割またはマージされないようにします。Avoid splitting or merging populated partitions. データが入力されているパーティションの分割やマージは効率的でなくなることがあります。Splitting or merging populated partitions can be inefficient. 非効率になる理由は、分割やマージによりログの生成が最大で 4 倍になり、大量のロックが発生する場合があるためです。They can be inefficient because the split or merge may cause as much as four times more log generation, and may also cause severe locking.

制限事項と制約事項Limitations and Restrictions

ALTER PARTITION FUNCTION は、1 回のアトミックな操作で、その関数を使用するすべてのテーブルおよびインデックスのパーティションを分割し直します。ALTER PARTITION FUNCTION repartitions any tables and indexes that use the function in a single atomic operation. しかし、この操作はオフラインで実行され、分割し直すエクステントによってはリソースを大きく消費します。However, this operation occurs offline, and depending on the extent of repartitioning, may be resource-intensive.

ALTER PARTITION FUNCTION は、1 つのパーティションを 2 つに分割する、または 2 つのパーティションを 1 つにマージするときにのみ使用します。Only use ALTER PARTITION FUNCTION for splitting one partition into two, or merging two partitions into one. 他のパーティション分割方法でテーブルを変更する (たとえば、10 のパーティションを 5 つにする) には、次のいずれかを実行します。To change the way a table is otherwise partitioned (for example, from 10 partitions to five partitions), exercise any of the following options. システムの構成に応じて、これらの方法のリソース消費量は異なる場合があります。Depending on the configuration of your system, these options may vary in resource consumption:

  • 必要なパーティション関数を使用して新しいパーティション テーブルを作成します。Create a new partitioned table with the necessary partition function. その後、INSERT INTO...SELECT FROM ステートメントを使用して、古いテーブルから新しいテーブルにデータを挿入します。Then, insert the data from the old table into the new table by using an INSERT INTO...SELECT FROM statement.

  • パーティション分割されたクラスター化インデックスを、ヒープ上に作成します。Create a partitioned clustered index on a heap.

    注意

    パーティション分割されたクラスター化インデックスを削除すると、パーティション分割されたヒープが生成されます。Dropping a partitioned clustered index results in a partitioned heap.

  • Transact-SQLTransact-SQL の CREATE INDEX ステートメントと DROP EXISTING = ON 句を使用して、既存のパーティション インデックスを削除および再構築します。Drop and rebuild an existing partitioned index by using the Transact-SQLTransact-SQL CREATE INDEX statement with the DROP EXISTING = ON clause.

  • 一連の ALTER PARTITION FUNCTION ステートメントを実行します。Run a sequence of ALTER PARTITION FUNCTION statements.

ALTER PARTITION FUNCTION の影響を受けるすべてのファイル グループは、オンラインである必要があります。All filegroups that are affected by ALTER PARTITION FUNCTION must be online.

ALTER PARTITION FUNCTION は、そのパーティション関数を使用するテーブル上に無効化されたクラスター化インデックスが存在すると失敗します。ALTER PARTITION FUNCTION fails when a disabled clustered index exists on any tables that use the partition function.

SQL ServerSQL Server では、パーティション関数の変更に関するレプリケーションはサポートされていません。doesn't provide replication support for modifying a partition function. パブリケーション データベース内のパーティション関数への変更は、手動でサブスクリプション データベースに適用させる必要があります。Changes to a partition function in the publication database must be manually applied in the subscription database.

アクセス許可Permissions

次の権限のいずれかを使用すると、ALTER PARTITION FUNCTION を実行できます。Any one of the following permissions can be used to execute ALTER PARTITION FUNCTION:

  • ALTER ANY DATASPACE 権限。ALTER ANY DATASPACE permission. この権限は、既定では sysadmin 固定サーバー ロール、 db_owner 固定データベース ロール、および db_ddladmin 固定データベース ロールのメンバーに与えられています。This permission defaults to members of the sysadmin fixed server role and the db_owner and db_ddladmin fixed database roles.

  • パーティション関数が作成されたデータベースでの CONTROL または ALTER 権限。CONTROL or ALTER permission on the database in which the partition function was created.

  • パーティション関数が作成されたデータベースのサーバーでの CONTROL SERVER または ALTER ANY DATABASE 権限。CONTROL SERVER or ALTER ANY DATABASE permission on the server of the database in which the partition function was created.

使用例Examples

A.A. パーティション テーブルまたはパーティション インデックスの 1 つのパーティションを 2 つのパーティションに分割するSplitting a partition of a partitioned table or index into two partitions

次の例では、テーブルまたはインデックスを 4 つのパーティションに分割するパーティション関数を作成します。The following example creates a partition function to partition a table or index into four partitions. ALTER PARTITION FUNCTION でこれらのパーティションのうちの 1 つを 2 つに分割して、合計 5 つのパーティションを作成します。ALTER PARTITION FUNCTION splits one of the partitions into two to create a total of five partitions.

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.B. パーティション テーブルの 2 つのパーティションを 1 つのパーティションにマージするMerging two partitions of a partitioned table into one partition

次の例では、上記と同じパーティション関数を作成し、次にこれらのパーティションのうちの 2 つを 1 つにマージして、合計 3 つのパーティションにします。The following example creates the same partition function as above, and then merges two of the partitions into one partition, for a total of three partitions.

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);  

参照See Also

パーティション テーブルとパーティション インデックス Partitioned Tables and Indexes
CREATE PARTITION FUNCTION (Transact-SQL) CREATE PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL) DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL) CREATE PARTITION SCHEME (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL) ALTER PARTITION SCHEME (Transact-SQL)
DROP PARTITION SCHEME (Transact-SQL) DROP PARTITION SCHEME (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
sys.partition_functions (Transact-SQL) sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL) sys.partition_range_values (Transact-SQL) sys.partition_parameters (Transact-SQL) sys.partition_range_values (Transact-SQL)
sys.partitions (Transact-SQL) sys.partitions (Transact-SQL)
sys.tables (Transact-SQL) sys.tables (Transact-SQL)
sys.indexes (Transact-SQL) sys.indexes (Transact-SQL)
sys.index_columns (Transact-SQL)sys.index_columns (Transact-SQL)