Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Switch-Out einer Partition in SQL Server (T-SQL)

In SQL Server können Sie durch Partitionswechsel sehr schnell große Datenmengen in eine oder aus einer Tabelle laden. Dies erspart Ihnen die Ausführung von Lösch- oder Einfügeanweisungen und kann sehr nützlich sein, wenn Sie mit großen Datensätzen arbeiten.

Sie können die ALTER TABLE verwenden Anweisung zum Wechseln einer Partition in eine oder aus einer Tabelle.

Um eine Partition aus einer Tabelle zu entfernen, sieht der Code so aus:

ALTER TABLE Table1
SWITCH PARTITION x TO Table2

Dies schaltet die Partition x um aus Table1 zu Table2 (wobei x ist die Partitionsnummer).

Beispiel

Die Einrichtung

Bevor wir mit dem Umstieg beginnen, erstellen wir das Grundsetup. Diese besteht aus zwei Tabellen. Eine ist die partitionierte Quelltabelle, die andere die Zieltabelle. Außerdem erstellen wir vier Dateigruppen – eine für jede Partition.

-- 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;

Ergebnis:

+----------------+
| OrdersLatest   |
|----------------|
| 5              |
+----------------+

+---------------+
| OrdersMarch   |
|---------------|
| 0             |
+---------------+

So wie es derzeit aussieht, haben wir fünf Zeilen in OrdersLatest Tabelle, die unsere partitionierte Tabelle ist.

Alle fünf Zeilen sollten sich in Partition 3 befinden. Lassen Sie uns das überprüfen.

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];

Ergebnis:

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg1 | 0      |
| 2           | OrdersLatestFg2 | 0      |
| 3           | OrdersLatestFg3 | 5      |
| 4           | OrdersLatestFg4 | 0      |
+-------------+-----------------+--------+

Ja, also können wir sehen, dass sich alle fünf Zeilen in Partition 3 befinden. Wir können auch sehen, dass Partition 3 dem OrdersLatestFg3 zugeordnet ist Dateigruppe. Damit unser „Ausschalten“ erfolgreich ist, müssen wir sicherstellen, dass unsere Zieltabelle diese Dateigruppe verwendet. Glücklicherweise macht unser obiger Code genau das. Wir haben ON OrdersLatestFg3 verwendet beim Erstellen der Tabelle, um anzugeben, dass die Tabelle in dieser Dateigruppe erstellt werden soll.

Ausschalten

OK, also ist alles bereit zum Wechseln. Lass es uns tun.

ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;

Ergebnis:

Commands completed successfully.

Exzellent. Unsere Umstellung hat funktioniert.

Lassen Sie uns noch einmal die Anzahl der Zeilen in jeder Tabelle überprüfen.

SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;

SELECT COUNT(*) AS OrdersMarch 
FROM OrdersMarch;

Ergebnis:

+----------------+
| OrdersLatest   |
|----------------|
| 0              |
+----------------+

+---------------+
| OrdersMarch   |
|---------------|
| 5             |
+---------------+

Wir können also sehen, dass die Daten aus OrdersLatest verschoben wurden Tabelle zu OrdersMarch Tabelle.

Sehen wir uns die Partitionsinformationen für OrdersLatest an .

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];

Ergebnis:

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg1 | 0      |
| 2           | OrdersLatestFg2 | 0      |
| 3           | OrdersLatestFg3 | 0      |
| 4           | OrdersLatestFg4 | 0      |
+-------------+-----------------+--------+

Wie erwartet, die OrdersLatestFg3 Partition ist jetzt leer. Dies liegt daran, dass es ausgeschaltet wurde.

Sehen wir uns die Partitionsinformationen für den OrdersMarch an Tabelle.

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];

Ergebnis:

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg3 | 5      |
+-------------+-----------------+--------+

Wie erwartet enthält die OrdersMarch-Tabelle fünf Zeilen. Sie werden in Partition 1 (der einzigen Partition) auf OrdersLatest3 gespeichert Dateigruppe.

Einschalten

Informationen zum Wechseln einer Partition finden Sie unter Wechseln einer Partition in SQL Server.