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でのパーティションのスイッチアウトを参照してください。