SQL Serverでは、パーティションテーブルの内外でパーティションを切り替えることができます。
これは、ALTER TABLEを使用して行うことができます 声明。基本的には次のようになります:
ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x
これにより、OldTableのパーティションが切り替わります。 パーティションxに NewTableの (ここでx はパーティション番号です)。
例
スイッチインを開始する前に、2つのテーブルを設定しましょう。 1つ(OrdersOldと呼ばれます )には、他のテーブル(OrdersNewと呼ばれる)に「スイッチイン」するデータが含まれます )。
OrdersNewを分割します 4つのパーティションに。
-- Create filegroups
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersNewFg1dat,
FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersNewFg1;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg2;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersNewFg2dat,
FILENAME = '/var/opt/mssql/data/OrdersNewFg2dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersNewFg2;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg3;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersNewFg3dat,
FILENAME = '/var/opt/mssql/data/OrdersNewFg3dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersNewFg3;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg4;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersNewFg4dat,
FILENAME = '/var/opt/mssql/data/OrdersNewFg4dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersNewFg4;
GO
-- Create a partition function that will result in four partitions
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)
AS RANGE RIGHT FOR VALUES (
'20200201',
'20200301',
'20200401'
);
GO
-- Create a partition scheme that maps the partitions to the filegroups
CREATE PARTITION SCHEME OrdersNewPartitionScheme
AS PARTITION OrdersNewPartitionFunction
TO (
OrdersNewFg1,
OrdersNewFg2,
OrdersNewFg3,
OrdersNewFg4
);
GO
-- Create a table that contains the data that we will be switching in.
-- Note that the filegroup matches the filegroup of the partition that we will switch in to.
-- Include CHECK constraint to restrict data to the range specified in the switch-in partition
CREATE TABLE OrdersOld (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT chkDate CHECK (OrderDate >= '20200301' AND OrderDate < '20200401'),
CONSTRAINT PKOrdersOld PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersNewFg3;
GO
-- Insert data into the OrdersOld table. This is the data we will be switching in to the OrdersNew table.
INSERT INTO OrdersOld(OrderDate, OrderDesc) VALUES
('20200302', 'Cat food'),
('20200315', 'Water bowl'),
('20200318', 'Saddle for camel'),
('20200321', 'Dog biscuits'),
('20200328', 'Bigfoot shoes');
GO
-- Create a partitioned table called OrdersNew that uses the OrderDate column as the partitioning column
CREATE TABLE OrdersNew (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrdersNew PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersNewPartitionScheme (OrderDate);
GO
-- Check how many rows are in each table
SELECT COUNT(*) AS OrdersOld
FROM OrdersOld;
SELECT COUNT(*) AS OrdersNew
FROM OrdersNew; 結果:
+-------------+ | OrdersOld | |-------------| | 5 | +-------------+ +-------------+ | OrdersNew | |-------------| | 0 | +-------------+
したがって、現在のところ、OrdersOld 5行とOrdersNewが含まれています 空です。
データを切り替える時間です。
ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3; 結果:
Commands completed successfully.
これで、データは宛先テーブルのパーティション3に正常に切り替えられました。
両方のテーブルをもう一度確認しましょう。
SELECT COUNT(*) AS OrdersOld
FROM OrdersOld;
SELECT COUNT(*) AS OrdersNew
FROM OrdersNew; 結果:
+-------------+ | OrdersOld | |-------------| | 0 | +-------------+ +-------------+ | OrdersNew | |-------------| | 5 | +-------------+
今回はOrdersOld は空で、OrdersNew 5行含まれています。
次のクエリを実行して、データが配置されている実際のパーティションを確認することもできます。
SELECT
p.partition_number AS [Partition],
fg.name AS [Filegroup],
p.Rows
FROM sys.partitions p
INNER JOIN sys.allocation_units au
ON au.container_id = p.hobt_id
INNER JOIN sys.filegroups fg
ON fg.data_space_id = au.data_space_id
WHERE p.object_id = OBJECT_ID('OrdersNew')
ORDER BY [Partition]; 結果:
+-------------+--------------+--------+ | Partition | Filegroup | Rows | |-------------+--------------+--------| | 1 | OrdersNewFg1 | 0 | | 2 | OrdersNewFg2 | 0 | | 3 | OrdersNewFg3 | 5 | | 4 | OrdersNewFg4 | 0 | +-------------+--------------+--------+
予想どおり、5行すべてがOrdersNewFg3のパーティション3に割り当てられます。 ファイルグループ。
一般的なエラー
エラー4982
上記の例では、CHECKを作成したことがわかります。 OrdersOldを作成するときの制約 テーブル。
エラーメッセージ4982(ALTER TABLE SWITCH statement failed...)が表示された場合 )、CHECKを作成しなかった可能性があります ソーステーブルの制約。
または、CHECKを作成した可能性があります 制約がありますが、スイッチインパーティションの範囲間の値は強制されません。
スイッチイン値が実際にパーティションで定義された範囲内にあることを確認する必要があります。SQLServerはCHECKを検索します。 これを検証するソーステーブルの制約。
エラー4939
もう1つの一般的なものは、エラー4939(ALTER TABLE SWITCH statement failed... )。
このエラーが発生した場合は、ソーステーブルとは異なるファイルグループを使用するパーティションに切り替えようとしている可能性があります。
パーティションを切り替えるための要件の1つは、ソーステーブルまたはパーティションとターゲットテーブルまたはパーティションの両方が同じファイルグループに配置されている必要があることです。
このエラーを修正するには、ソーステーブルが宛先パーティションと同じファイルグループを使用していることを確認してください。
スイッチアウト
パーティションをスイッチアウトする方法については、SQLServerでのパーティションのスイッチアウトを参照してください。