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

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

V SQL Server můžete přepínat oddíly do a z dělené tabulky.

Můžete to udělat pomocí ALTER TABLE prohlášení. V zásadě to vypadá takto:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

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

Příklad

Než začneme zapojovat, připravíme dva stoly. Jedna (nazývaná OrdersOld ) bude obsahovat data, která chceme „přepnout“ do druhé tabulky (nazvané OrdersNew ).

Rozdělíme OrdersNew do čtyř oddílů.

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

Výsledek:

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

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

Takže jak je to teď, OrdersOld obsahuje 5 řádků a OrdersNew je prázdný.

Je čas přepnout data.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Výsledek:

Commands completed successfully.

Data byla nyní úspěšně přepnuta do oddílu 3 cílové tabulky.

Podívejme se znovu na obě tabulky.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Výsledek:

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

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

Tentokrát OrdersOld je prázdný a OrdersNew obsahuje 5 řádků.

Můžeme také spustit následující dotaz a zkontrolovat skutečný oddíl, ve kterém jsou data umístěna.

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

Výsledek:

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

Podle očekávání je všech 5 řádků přiděleno oddílu 3 v OrdersNewFg3 skupina souborů.

Běžné chyby

Chyba 4982

V mém příkladu výše si všimnete, že jsem vytvořil CHECK omezení při vytváření OrdersOld tabulka.

Pokud se zobrazí chybová zpráva 4982 (ALTER TABLE SWITCH statement failed... ), je možné, že jste nevytvořili CHECK omezení na zdrojové tabulce.

Nebo je možné, že jste vytvořili CHECK omezení, ale nevynucuje hodnoty mezi rozsahem přepínacího oddílu.

Musíte se ujistit, že hodnoty přepnutí jsou ve skutečnosti v rozsahu definovaném oddílem a SQL Server bude hledat CHECK omezení na zdrojové tabulce, které to ověřuje.

Chyba 4939

Další běžnou chybou je chyba 4939 (ALTER TABLE SWITCH statement failed... ).

Pokud se zobrazí tato chyba, je to pravděpodobně proto, že se pokoušíte přepnout na oddíl, který používá jinou skupinu souborů než zdrojová tabulka.

Jedním z požadavků přepínání oddílů je, že jak zdrojová tabulka nebo oddíl, tak cílová tabulka nebo oddíl musí být umístěny ve stejné skupině souborů.

Chcete-li tuto chybu opravit, ujistěte se, že zdrojová tabulka používá stejnou skupinu souborů jako cílový oddíl.

Vypínání

Informace o tom, jak přepnout oddíl, najdete v části Přepnutí oddílu na serveru SQL.


  1. Vložit více řádků jedním dotazem MySQL

  2. Aplikace se zhroutí při instalaci s chybou sqlite3_exec – Nepodařilo se nastavit synchronní režim =1 (normální)

  3. Připojte se k databázi PostgreSQL na kontejneru Docker

  4. Věci, které byste měli vědět, než se naučíte Oracle