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

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

In SQL Server können Sie Partitionen in und aus einer partitionierten Tabelle wechseln.

Sie können dies mit ALTER TABLE tun Erklärung. Im Grunde geht das so:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

Dies schaltet die Partition für OldTable um in Partition x von NewTable (wobei x ist die Partitionsnummer).

Beispiel

Bevor wir mit dem Einwechseln beginnen, richten wir zwei Tische ein. Eine (genannt OrdersOld ) enthält die Daten, die wir in die andere Tabelle (namens OrdersNew) „einwechseln“ möchten ).

Wir partitionieren OrdersNew in vier Partitionen.

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

Ergebnis:

+-------------+
| OrdersOld   |
|-------------|
| 5           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 0           |
+-------------+

So wie es jetzt aussieht, OrdersOld enthält 5 Zeilen und OrdersNew ist leer.

Zeit, die Daten einzuschalten.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Ergebnis:

Commands completed successfully.

Die Daten wurden nun erfolgreich auf Partition 3 der Zieltabelle umgeschaltet.

Lassen Sie uns beide Tabellen noch einmal überprüfen.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Ergebnis:

+-------------+
| OrdersOld   |
|-------------|
| 0           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 5           |
+-------------+

Dieses Mal OrdersOld ist leer und OrdersNew enthält 5 Zeilen.

Wir können auch die folgende Abfrage ausführen, um die tatsächliche Partition zu überprüfen, in der sich die Daten befinden.

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

Ergebnis:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg2 | 0      |
| 3           | OrdersNewFg3 | 5      |
| 4           | OrdersNewFg4 | 0      |
+-------------+--------------+--------+

Wie erwartet werden alle 5 Zeilen der Partition 3 in OrdersNewFg3 zugewiesen Dateigruppe.

Häufige Fehler

Fehler 4982

In meinem obigen Beispiel werden Sie feststellen, dass ich einen CHECK erstellt habe Einschränkung beim Erstellen von OrdersOld Tabelle.

Wenn Sie die Fehlermeldung 4982 (ALTER TABLE SWITCH statement failed... ), könnte es sein, dass Sie keinen CHECK erstellt haben Einschränkung für die Quelltabelle.

Oder es könnte sein, dass Sie einen CHECK erstellt haben Einschränkung, erzwingt jedoch keine Werte zwischen dem Bereich der Switch-in-Partition.

Sie müssen sicherstellen, dass die Einschaltwerte tatsächlich innerhalb des von der Partition definierten Bereichs liegen, und SQL Server sucht nach einem CHECK Einschränkung für die Quelltabelle, die dies überprüft.

Fehler 4939

Ein weiterer häufiger Fehler ist Fehler 4939 (ALTER TABLE SWITCH statement failed... ).

Wenn Sie diesen Fehler erhalten, liegt das wahrscheinlich daran, dass Sie versuchen, zu einer Partition zu wechseln, die eine andere Dateigruppe als die Quelltabelle verwendet.

Eine der Voraussetzungen für das Wechseln von Partitionen ist, dass sich sowohl die Quelltabelle oder -partition als auch die Zieltabelle oder -partition in derselben Dateigruppe befinden müssen.

Um diesen Fehler zu beheben, stellen Sie sicher, dass die Quelltabelle dieselbe Dateigruppe wie die Zielpartition verwendet.

Ausschalten

Siehe Partition in SQL Server ausschalten, um zu erfahren, wie man eine Partition ausschaltet.