Di SQL Server, pengalihan partisi memungkinkan Anda memuat data dalam jumlah besar ke dalam atau ke luar tabel dengan sangat cepat. Ini menyelamatkan Anda dari keharusan menjalankan pernyataan hapus atau sisipkan, dan bisa sangat berguna saat bekerja dengan kumpulan data besar.
Anda dapat menggunakan ALTER TABLE
pernyataan untuk mengganti partisi masuk atau keluar dari tabel.
Untuk mengganti partisi dari tabel, kodenya seperti ini:
ALTER TABLE Table1
SWITCH PARTITION x TO Table2
Ini mengganti partisi x
dari Table1
ke Table2
(di mana x
adalah nomor partisi).
Contoh
Penyiapan
Sebelum kita mulai beralih, kita akan membuat pengaturan dasar. Ini akan terdiri dari dua tabel. Satu akan menjadi tabel sumber yang dipartisi, yang lain akan menjadi tabel tujuan. Kami juga akan membuat empat grup file – satu untuk setiap partisi.
-- 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;
Hasil:
+----------------+ | OrdersLatest | |----------------| | 5 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 0 | +---------------+
Jadi seperti saat ini, kami memiliki lima baris di OrdersLatest
table, yang merupakan tabel kita yang dipartisi.
Kelima baris harus berada di partisi 3. Mari kita periksa.
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];
Hasil:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 5 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
Ya, jadi kita bisa melihat bahwa kelima baris berada di partisi 3. Kita juga bisa melihat bahwa partisi 3 dipetakan ke OrdersLatestFg3
grup file. Agar "switch out" kita berhasil, kita perlu memastikan bahwa tabel tujuan kita menggunakan filegroup ini. Untungnya, kode kami di atas melakukan hal itu. Kami menggunakan ON OrdersLatestFg3
saat membuat tabel untuk menentukan bahwa tabel harus dibuat pada filegroup tersebut.
Matikan
OK, jadi semuanya siap untuk dimatikan. Ayo lakukan.
ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;
Hasil:
Commands completed successfully.
Bagus sekali. Pengalihan kami berhasil.
Mari kita periksa kembali jumlah baris di setiap tabel.
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;
SELECT COUNT(*) AS OrdersMarch
FROM OrdersMarch;
Hasil:
+----------------+ | OrdersLatest | |----------------| | 0 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 5 | +---------------+
Jadi kita bisa melihat bahwa data telah dipindahkan dari OrdersLatest
tabel ke OrdersMarch
tabel.
Mari kita periksa info partisi untuk 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];
Hasil:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 0 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
Seperti yang diharapkan, OrdersLatestFg3
partisi sekarang kosong. Ini karena telah dimatikan.
Mari kita periksa info partisi untuk OrdersMarch
tabel.
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];
Hasil:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg3 | 5 | +-------------+-----------------+--------+
Sekali lagi seperti yang diharapkan, tabel OrdersMarch berisi lima baris. Mereka disimpan di partisi 1 (satu-satunya partisi) di OrdersLatest3
grup file.
Beralih
Lihat Mengalihkan Partisi di SQL Server untuk cara mengaktifkan partisi.