Di SQL Server, Anda dapat mengganti partisi masuk dan keluar dari tabel yang dipartisi.
Anda dapat melakukannya dengan ALTER TABLE
penyataan. Pada dasarnya, ini seperti ini:
ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x
Ini mengganti partisi untuk OldTable
ke dalam partisi x
dari NewTable
(di mana x
adalah nomor partisi).
Contoh
Sebelum kita mulai beralih, mari kita siapkan dua tabel. Satu (disebut OrdersOld
) akan berisi data yang ingin kita “alihkan” ke tabel lain (disebut OrdersNew
).
Kami akan mempartisi OrdersNew
menjadi empat partisi.
-- 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;
Hasil:
+-------------+ | OrdersOld | |-------------| | 5 | +-------------+ +-------------+ | OrdersNew | |-------------| | 0 | +-------------+
Jadi seperti sekarang, OrdersOld
berisi 5 baris dan OrdersNew
kosong.
Saatnya beralih data.
ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;
Hasil:
Commands completed successfully.
Data sekarang telah berhasil dialihkan ke partisi 3 dari tabel tujuan.
Mari kita periksa kedua tabel lagi.
SELECT COUNT(*) AS OrdersOld
FROM OrdersOld;
SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;
Hasil:
+-------------+ | OrdersOld | |-------------| | 0 | +-------------+ +-------------+ | OrdersNew | |-------------| | 5 | +-------------+
Kali ini OrdersOld
kosong dan OrdersNew
berisi 5 baris.
Kami juga dapat menjalankan kueri berikut untuk memeriksa partisi sebenarnya tempat data berada.
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];
Hasil:
+-------------+--------------+--------+ | Partition | Filegroup | Rows | |-------------+--------------+--------| | 1 | OrdersNewFg1 | 0 | | 2 | OrdersNewFg2 | 0 | | 3 | OrdersNewFg3 | 5 | | 4 | OrdersNewFg4 | 0 | +-------------+--------------+--------+
Seperti yang diharapkan, semua 5 baris dialokasikan ke partisi 3, di OrdersNewFg3
grup file.
Kesalahan Umum
Kesalahan 4982
Dalam contoh saya di atas, Anda akan melihat bahwa saya membuat CHECK
kendala saat membuat OrdersOld
tabel.
Jika Anda mendapatkan pesan kesalahan 4982 (pernyataan ALTER TABLE SWITCH gagal... ), bisa jadi Anda tidak membuat CHECK
kendala pada tabel sumber.
Atau bisa juga Anda membuat CHECK
kendala, tetapi tidak memberlakukan nilai antara rentang partisi switch-in.
Anda perlu memastikan bahwa nilai switch-in sebenarnya, dalam rentang yang ditentukan oleh partisi, dan SQL Server akan mencari CHECK
kendala pada tabel sumber yang memverifikasi ini.
Kesalahan 4939
Kesalahan umum lainnya adalah kesalahan 4939 (pernyataan ALTER TABLE SWITCH gagal...
).
Jika Anda mendapatkan kesalahan ini, mungkin karena Anda mencoba beralih ke partisi yang menggunakan grup file berbeda ke tabel sumber.
Salah satu persyaratan untuk berpindah partisi adalah tabel atau partisi sumber, dan tabel atau partisi target, harus ditempatkan di grup file yang sama.
Untuk memperbaiki kesalahan ini, pastikan tabel sumber menggunakan grup file yang sama dengan partisi tujuan.
Mematikan
Lihat Mematikan Partisi di SQL Server untuk mengetahui cara mematikan partisi.