SQL Serverでは、パーティションの切り替えにより、テーブルに大量のデータをすばやくロードしたり、テーブルからロードしたりできます。これにより、deleteまたはinsertステートメントを実行する必要がなくなり、大規模なデータセットを操作するときに非常に役立ちます。
ALTER TABLE
を使用できます テーブルの内外にパーティションを切り替えるステートメント。
テーブルからパーティションを切り替えるには、コードは次のようになります。
ALTER TABLE Table1
SWITCH PARTITION x TO Table2
これにより、パーティションx
が切り替わります。 Table1
から Table2
へ (ここでx
はパーティション番号です)。
例
セットアップ
切り替えを開始する前に、基本的な設定を作成します。これは2つのテーブルで構成されます。 1つはパーティション化されたソーステーブルになり、もう1つは宛先テーブルになります。また、パーティションごとに1つずつ、合計4つのファイルグループを作成します。
-- Create filegroups
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg1;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg1dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg1dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg1;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg2;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg2dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg2dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg2;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg3;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg3dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg3dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg3;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg4;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg4dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg4dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg4;
GO
-- Create a partition function that will result in four partitions
CREATE PARTITION FUNCTION OrdersLatestPartitionFunction (date)
AS RANGE RIGHT FOR VALUES (
'20200201',
'20200301',
'20200401'
);
GO
-- Create a partition scheme that maps the partitions to the filegroups
CREATE PARTITION SCHEME OrdersLatestPartitionScheme
AS PARTITION OrdersLatestPartitionFunction
TO (
OrdersLatestFg1,
OrdersLatestFg2,
OrdersLatestFg3,
OrdersLatestFg4
);
GO
-- Create a partitioned table called OrdersLatest that uses the OrderDate column as the partitioning column
CREATE TABLE OrdersLatest (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrdersLatest PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersLatestPartitionScheme(OrderDate);
GO
-- Insert data into the OrdersLatest table.
-- This will end up in partition 3, which is the partition we will switch out to the OrdersMarch table.
INSERT INTO OrdersLatest(OrderDate, OrderDesc) VALUES
('20200302', 'Cat food'),
('20200315', 'Water bowl'),
('20200318', 'Saddle for camel'),
('20200321', 'Dog biscuits'),
('20200328', 'Bigfoot shoes');
GO
-- Create a table that contains the data that we will be switching out to.
-- Note that the filegroup matches the filegroup of the partition that we will switch out of.
CREATE TABLE OrdersMarch (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrdersMarch PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersLatestFg3;
GO
-- Check how many rows are in each table
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;
SELECT COUNT(*) AS OrdersMarch
FROM OrdersMarch;
結果:
+----------------+ | OrdersLatest | |----------------| | 5 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 0 | +---------------+
したがって、現在のところ、OrdersLatest
には5つの行があります パーティション化されたテーブルであるテーブル。
5行すべてがパーティション3にあるはずです。それを確認しましょう。
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('OrdersLatest')
ORDER BY [Partition];
結果:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 5 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
はい、5つの行すべてがパーティション3にあることがわかります。パーティション3がOrdersLatestFg3
にマップされていることもわかります。 ファイルグループ。 「スイッチアウト」を成功させるには、宛先テーブルがこのファイルグループを使用していることを確認する必要があります。幸い、上記のコードはまさにそれを実行します。 ON OrdersLatestFg3
を使用しました テーブルをそのファイルグループに作成するように指定するためにテーブルを作成するとき。
スイッチアウト
OK、すべてを切り替える準備ができました。やってみましょう。
ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;
結果:
Commands completed successfully.
素晴らしい。スイッチアウトは機能しました。
各テーブルの行数をもう一度確認しましょう。
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;
SELECT COUNT(*) AS OrdersMarch
FROM OrdersMarch;
結果:
+----------------+ | OrdersLatest | |----------------| | 0 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 5 | +---------------+
したがって、データがOrdersLatest
から移動されたことがわかります。 OrdersMarch
へのテーブル テーブル。
OrdersLatest
のパーティション情報を確認しましょう 。
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('OrdersLatest')
ORDER BY [Partition];
結果:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 0 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
予想どおり、OrdersLatestFg3
パーティションは空になりました。これは、切り替えられたためです。
OrdersMarch
のパーティション情報を確認しましょう テーブル。
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('OrdersMarch')
ORDER BY [Partition];
結果:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg3 | 5 | +-------------+-----------------+--------+
予想どおり、OrdersMarchテーブルには5つの行が含まれています。これらは、OrdersLatest3
のパーティション1(唯一のパーティション)に保存されます。 ファイルグループ。
スイッチイン
パーティションをスイッチインする方法については、SQLServerでのパーティションのスイッチインを参照してください。