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

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

W SQL Server przełączanie partycji umożliwia bardzo szybkie ładowanie dużych ilości danych do lub z tabeli. Oszczędza to konieczności uruchamiania instrukcji usuwania lub wstawiania i może być bardzo przydatne podczas pracy z dużymi zestawami danych.

Możesz użyć ALTER TABLE instrukcja przełączania partycji w tabeli lub z niej.

Aby przełączyć partycję z tabeli, kod wygląda tak:

ALTER TABLE Table1
SWITCH PARTITION x TO Table2

To przełącza partycję x z Table1 do Table2 (gdzie x to numer partycji).

Przykład

Konfiguracja

Zanim zaczniemy się zmieniać, stworzymy podstawową konfigurację. Będzie to składało się z dwóch tabel. Jedna będzie podzieloną na partycje tabelą źródłową, druga będzie tabelą docelową. Stworzymy również cztery grupy plików – po jednej dla każdej partycji.

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

Wynik:

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

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

W obecnej formie mamy pięć wierszy w OrdersLatest tabela, która jest naszą podzieloną na partycje tabelą.

Wszystkie pięć wierszy powinno znajdować się w partycji 3. Sprawdźmy to.

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

Wynik:

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

Tak, więc widzimy, że wszystkie pięć wierszy znajduje się w partycji 3. Możemy również zobaczyć, że partycja 3 jest zmapowana do OrdersLatestFg3 grupa plików. Aby nasze „przełączanie” się powiodło, musimy upewnić się, że nasza tabela docelowa używa tej grupy plików. Na szczęście nasz powyższy kod robi dokładnie to. Użyliśmy ON OrdersLatestFg3 podczas tworzenia tabeli, aby określić, że tabela powinna zostać utworzona na tej grupie plików.

Wyłącz

OK, więc wszystko jest gotowe do zmiany. Zróbmy to.

ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;

Wynik:

Commands completed successfully.

Doskonały. Nasz przełącznik zadziałał.

Sprawdźmy ponownie liczbę wierszy w każdej tabeli.

SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;

SELECT COUNT(*) AS OrdersMarch 
FROM OrdersMarch;

Wynik:

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

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

Widzimy więc, że dane zostały przeniesione z OrdersLatest tabela do OrdersMarch tabela.

Sprawdźmy informacje o partycjach dla 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];

Wynik:

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

Zgodnie z oczekiwaniami OrdersLatestFg3 partycja jest teraz pusta. Dzieje się tak, ponieważ został wyłączony.

Sprawdźmy informacje o partycjach dla OrdersMarch tabela.

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

Wynik:

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

Ponownie zgodnie z oczekiwaniami tabela OrdersMarch zawiera pięć wierszy. Są one przechowywane w partycji 1 (jedyna partycja) na OrdersLatest3 grupa plików.

Przełą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. Jak pogrupować według miesiąca z pola Data za pomocą sql

  2. Konwertuj wartość kolumny oddzielonej przecinkami na wiersze

  3. Przedstawiamy nową funkcję — replikację Spotlight w chmurze

  4. SET a SELECT podczas przypisywania zmiennych?

  5. Jak mogę połączyć się z serwerem SQL z komputera Mac z PHP PDO?