W SQL Server przełączanie partycji umożliwia bardzo szybkie ładowanie dużych ilości danych do lub z tabeli. Oszczędza to konieczności uruchamiania instrukcji usuwania lub wstawiania i może być bardzo przydatne podczas pracy z dużymi zestawami danych.
Możesz użyć ALTER TABLE
instrukcja przełączania partycji w tabeli lub z niej.
Aby przełączyć partycję z tabeli, kod wygląda tak:
ALTER TABLE Table1
SWITCH PARTITION x TO Table2
To przełącza partycję x
z Table1
do Table2
(gdzie x
to numer partycji).
Przykład
Konfiguracja
Zanim zaczniemy się zmieniać, stworzymy podstawową konfigurację. Będzie to składało się z dwóch tabel. Jedna będzie podzieloną na partycje tabelą źródłową, druga będzie tabelą docelową. Stworzymy również cztery grupy plików – po jednej dla każdej partycji.
-- 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;
Wynik:
+----------------+ | OrdersLatest | |----------------| | 5 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 0 | +---------------+
W obecnej formie mamy pięć wierszy w OrdersLatest
tabela, która jest naszą podzieloną na partycje tabelą.
Wszystkie pięć wierszy powinno znajdować się w partycji 3. Sprawdźmy to.
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];
Wynik:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 5 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
Tak, więc widzimy, że wszystkie pięć wierszy znajduje się w partycji 3. Możemy również zobaczyć, że partycja 3 jest zmapowana do OrdersLatestFg3
grupa plików. Aby nasze „przełączanie” się powiodło, musimy upewnić się, że nasza tabela docelowa używa tej grupy plików. Na szczęście nasz powyższy kod robi dokładnie to. Użyliśmy ON OrdersLatestFg3
podczas tworzenia tabeli, aby określić, że tabela powinna zostać utworzona na tej grupie plików.
Wyłącz
OK, więc wszystko jest gotowe do zmiany. Zróbmy to.
ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;
Wynik:
Commands completed successfully.
Doskonały. Nasz przełącznik zadziałał.
Sprawdźmy ponownie liczbę wierszy w każdej tabeli.
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;
SELECT COUNT(*) AS OrdersMarch
FROM OrdersMarch;
Wynik:
+----------------+ | OrdersLatest | |----------------| | 0 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 5 | +---------------+
Widzimy więc, że dane zostały przeniesione z OrdersLatest
tabela do OrdersMarch
tabela.
Sprawdźmy informacje o partycjach dla 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];
Wynik:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 0 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
Zgodnie z oczekiwaniami OrdersLatestFg3
partycja jest teraz pusta. Dzieje się tak, ponieważ został wyłączony.
Sprawdźmy informacje o partycjach dla OrdersMarch
tabela.
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];
Wynik:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg3 | 5 | +-------------+-----------------+--------+
Ponownie zgodnie z oczekiwaniami tabela OrdersMarch zawiera pięć wierszy. Są one przechowywane w partycji 1 (jedyna partycja) na OrdersLatest3
grupa plików.
Przełączanie
Zobacz Przełączanie partycji w programie SQL Server, aby dowiedzieć się, jak przełączyć partycję.