sql >> Database >  >> RDS >> Sqlserver

Schakel een partitie in SQL Server (T-SQL) uit

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.


  1. Hoe MariaDB 10 op Debian en Ubuntu te installeren

  2. De beste manier om json te cachen

  3. Alleen-lezen routering voor een Always On

  4. Leer hoe u Excel-gegevens importeert in een MySQL-database