In SQL Server kunt u met partitiewisseling zeer snel grote hoeveelheden gegevens in of uit een tabel laden. Dit bespaart u het uitvoeren van verwijder- of invoeginstructies en kan erg handig zijn bij het werken met grote gegevenssets.
U kunt de ALTER TABLE
. gebruiken statement om een partitie in of uit een tabel te schakelen.
Om een partitie uit een tabel te schakelen, gaat de code als volgt:
ALTER TABLE Table1
SWITCH PARTITION x TO Table2
Dit schakelt partitie x
van Table1
naar Table2
(waar x
is het partitienummer).
Voorbeeld
De installatie
Voordat we beginnen met overstappen, maken we de basisconfiguratie. Deze zal bestaan uit twee tabellen. De ene zal de gepartitioneerde brontabel zijn, de andere de doeltabel. We zullen ook vier bestandsgroepen maken - één voor elke partitie.
-- 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;
Resultaat:
+----------------+ | OrdersLatest | |----------------| | 5 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 0 | +---------------+
Dus zoals het er nu uitziet, hebben we vijf rijen in de OrdersLatest
table, wat onze gepartitioneerde tabel is.
Alle vijf de rijen zouden in partitie 3 moeten staan. Laten we dat eens controleren.
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];
Resultaat:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 5 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
Ja, dus we kunnen zien dat alle vijf rijen zich in partitie 3 bevinden. We kunnen ook zien dat partitie 3 is toegewezen aan de OrdersLatestFg3
bestandsgroep. Om onze "uitschakeling" succesvol te laten zijn, moeten we ervoor zorgen dat onze bestemmingstabel deze bestandsgroep gebruikt. Gelukkig doet onze bovenstaande code precies dat. We gebruikten ON OrdersLatestFg3
bij het maken van de tabel om aan te geven dat de tabel op die bestandsgroep moet worden aangemaakt.
Uitschakelen
OK, dus alles is klaar om uit te schakelen. Laten we het doen.
ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;
Resultaat:
Commands completed successfully.
Uitmuntend. Onze uitschakeling werkte.
Laten we het aantal rijen in elke tabel nogmaals controleren.
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;
SELECT COUNT(*) AS OrdersMarch
FROM OrdersMarch;
Resultaat:
+----------------+ | OrdersLatest | |----------------| | 0 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 5 | +---------------+
We kunnen dus zien dat de gegevens zijn verplaatst van de OrdersLatest
tafel tot OrdersMarch
tafel.
Laten we de partitie-informatie controleren voor 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];
Resultaat:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 0 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
Zoals verwacht, de OrdersLatestFg3
partitie is nu leeg. Dit komt omdat het is uitgeschakeld.
Laten we eens kijken naar de partitie-info voor de OrdersMarch
tafel.
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];
Resultaat:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg3 | 5 | +-------------+-----------------+--------+
Zoals verwacht, bevat de tabel OrdersMarch vijf rijen. Ze worden opgeslagen in partitie 1 (de enige partitie) op de OrdersLatest3
bestandsgroep.
Inschakelen
Zie Een partitie inschakelen in SQL Server voor het inschakelen van een partitie.