sql >> Databáze >  >> RDS >> Sqlserver

Přepnutí oddílu na serveru SQL (T-SQL)

Na serveru SQL Server vám přepínání oddílů umožňuje velmi rychle načítat velké množství dat do nebo z tabulky. To vám ušetří nutnost spouštět příkazy delete nebo insert a může to být velmi užitečné při práci s velkými soubory dat.

Můžete použít ALTER TABLE příkaz pro přepnutí oddílu do nebo z tabulky.

Chcete-li přepnout oddíl z tabulky, kód vypadá takto:

ALTER TABLE Table1
SWITCH PARTITION x TO Table2

Tím se přepne oddíl x z Table1 do Table2 (kde x je číslo oddílu).

Příklad

Nastavení

Než začneme vypínat, vytvoříme základní nastavení. Ten se bude skládat ze dvou tabulek. Jedna bude rozdělená zdrojová tabulka, druhá bude cílová tabulka. Vytvoříme také čtyři skupiny souborů – jednu pro každý oddíl.

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

Výsledek:

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

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

Takže v současném stavu máme pět řádků v OrdersLatest table, což je naše rozdělená tabulka.

Všech pět řádků by mělo být v oddílu 3. Pojďme to zkontrolovat.

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

Výsledek:

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

Ano, takže můžeme vidět, že všech pět řádků je v oddílu 3. Můžeme také vidět, že oddíl 3 je namapován na OrdersLatestFg3 skupina souborů. Aby naše „přepnutí“ bylo úspěšné, musíme zajistit, aby naše cílová tabulka používala tuto skupinu souborů. Naštěstí náš výše uvedený kód dělá přesně to. Použili jsme ON OrdersLatestFg3 při vytváření tabulky, abyste určili, že tabulka má být vytvořena v této skupině souborů.

Vypnout

Dobře, takže vše je připraveno k vypnutí. Pojďme na to.

ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;

Výsledek:

Commands completed successfully.

Vynikající. Náš vypínač fungoval.

Pojďme znovu zkontrolovat počet řádků v každé tabulce.

SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;

SELECT COUNT(*) AS OrdersMarch 
FROM OrdersMarch;

Výsledek:

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

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

Můžeme tedy vidět, že data byla přesunuta z OrdersLatest tabulky do OrdersMarch tabulka.

Pojďme zkontrolovat informace o oddílu pro 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];

Výsledek:

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

Podle očekávání OrdersLatestFg3 oddíl je nyní prázdný. Je to proto, že bylo vypnuto.

Pojďme zkontrolovat informace o oddílu pro OrdersMarch tabulka.

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

Výsledek:

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

Opět podle očekávání obsahuje tabulka OrdersMarch pět řádků. Jsou uloženy v oddílu 1 (jediném oddílu) na OrdersLatest3 skupina souborů.

Zapínání

Informace o tom, jak přepnout oddíl, najdete v tématu Přepnutí oddílu na SQL Server.


  1. PL/SQL vytiskne referenční kurzor vrácený uloženou procedurou

  2. Řešení pro INSERT OR UPDATE na SQL Server

  3. Jak ukládat pouze čas; není datum a čas?

  4. Spravovaný ovladač ODP.NET se nezobrazuje v dialogovém okně Zdroj dat