Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przełączanie partycji w SQL Server (T-SQL)

W SQL Server można przełączać partycje do iz tabeli partycjonowanej.

Możesz to zrobić za pomocą ALTER TABLE oświadczenie. Zasadniczo wygląda to tak:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

To przełącza partycję na OldTable na partycję x z NewTable (gdzie x to numer partycji).

Przykład

Zanim zaczniemy się przełączać, ustawmy dwa stoły. Jeden (o nazwie OrdersOld ) będzie zawierać dane, które chcemy „przełączyć” do innej tabeli (o nazwie OrdersNew ).

Podzielimy OrdersNew na cztery partycje.

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

Wynik:

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

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

W obecnej formie OrdersOld zawiera 5 wierszy i OrdersNew jest pusty.

Czas na wprowadzenie danych.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Wynik:

Commands completed successfully.

Dane zostały teraz pomyślnie przeniesione do partycji 3 tabeli docelowej.

Sprawdźmy ponownie obie tabele.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Wynik:

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

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

Tym razem OrdersOld jest pusty i OrdersNew zawiera 5 wierszy.

Możemy również uruchomić następujące zapytanie, aby sprawdzić rzeczywistą partycję, na której znajdują się dane.

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

Wynik:

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

Zgodnie z oczekiwaniami, wszystkie 5 wierszy jest przydzielonych do partycji 3, w OrdersNewFg3 grupa plików.

Typowe błędy

Błąd 4982

W powyższym przykładzie zauważysz, że utworzyłem CHECK ograniczenie podczas tworzenia OrdersOld tabela.

Jeśli otrzymasz komunikat o błędzie 4982 (instrukcja ALTER TABLE SWITCH statement failed... ), możliwe, że nie utworzyłeś CHECK ograniczenie w tabeli źródłowej.

Lub może być tak, że utworzyłeś CHECK ograniczenie, ale nie wymusza wartości między zakresem partycji przełączania.

Musisz upewnić się, że wartości przełączania znajdują się w rzeczywistości w zakresie określonym przez partycję, a SQL Server będzie szukał CHECK ograniczenie w tabeli źródłowej, która to weryfikuje.

Błąd 4939

Innym powszechnym jest błąd 4939 (instrukcja ALTER TABLE SWITCH statement failed... ).

Jeśli pojawi się ten błąd, to prawdopodobnie dlatego, że próbujesz przełączyć się na partycję, która używa innej grupy plików niż tabela źródłowa.

Jednym z wymagań przełączania partycji jest to, że zarówno tabela lub partycja źródłowa, jak i tabela lub partycja docelowa muszą znajdować się w tej samej grupie plików.

Aby naprawić ten błąd, upewnij się, że tabela źródłowa używa tej samej grupy plików co partycja docelowa.

Wyłączanie

Zobacz Przełączanie partycji w programie SQL Server, aby dowiedzieć się, jak przełączyć partycję.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL do pobrania danych z ostatnich 3 miesięcy

  2. Sprawdź, czy obiekt jest procedurą składowaną, używając OBJECTPROPERTY() w SQL Server

  3. Co to jest domyślne ograniczenie w programie SQL Server — samouczek dotyczący programu SQL Server / TSQL — część 90

  4. Jak mogę zobaczyć aktywne połączenia SQL Server?

  5. Jak ustawić poniedziałek jako pierwszy dzień tygodnia w SQL Server