Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chuyển ra một phân vùng trong SQL Server (T-SQL)

Trong SQL Server, chuyển đổi phân vùng cho phép bạn tải một lượng lớn dữ liệu vào hoặc ra khỏi bảng rất nhanh chóng. Điều này giúp bạn không phải chạy câu lệnh xóa hoặc chèn và có thể rất hữu ích khi làm việc với các tập dữ liệu lớn.

Bạn có thể sử dụng ALTER TABLE để chuyển một phân vùng vào hoặc ra khỏi bảng.

Để chuyển một phân vùng ra khỏi bảng, mã sẽ như sau:

ALTER TABLE Table1
SWITCH PARTITION x TO Table2

Điều này sẽ chuyển đổi phân vùng x từ Table1 tới Table2 (trong đó x là số phân vùng).

Ví dụ

Thiết lập

Trước khi bắt đầu chuyển sang sử dụng, chúng tôi sẽ tạo thiết lập cơ bản. Điều này sẽ bao gồm hai bảng. Một sẽ là bảng nguồn được phân vùng, một sẽ là bảng đích. Chúng tôi cũng sẽ tạo bốn nhóm tệp - một nhóm cho mỗi phân vùng.

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

Kết quả:

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

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

Vì vậy, như hiện tại, chúng ta có năm hàng trong OrdersLatest bảng, là bảng được phân vùng của chúng tôi.

Tất cả năm hàng phải nằm trong phân vùng 3. Hãy kiểm tra điều đó.

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

Kết quả:

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

Có, vì vậy chúng ta có thể thấy rằng tất cả năm hàng đều nằm trong phân vùng 3. Chúng ta cũng có thể thấy rằng phân vùng 3 được ánh xạ tới OrdersLatestFg3 nhóm tệp. Để "chuyển đổi" của chúng tôi thành công, chúng tôi cần đảm bảo rằng bảng đích của chúng tôi sử dụng nhóm tệp này. May mắn thay, đoạn mã trên của chúng tôi thực hiện chính xác điều đó. Chúng tôi đã sử dụng ON OrdersLatestFg3 khi tạo bảng để chỉ định rằng bảng sẽ được tạo trên nhóm tệp đó.

Chuyển ra ngoài

OK, vậy là mọi thứ đã sẵn sàng để chuyển đổi. Hãy làm điều đó.

ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;

Kết quả:

Commands completed successfully.

Thông minh. Công tắc của chúng tôi đã hoạt động.

Hãy kiểm tra lại số hàng trong mỗi bảng.

SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;

SELECT COUNT(*) AS OrdersMarch 
FROM OrdersMarch;

Kết quả:

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

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

Vì vậy, chúng ta có thể thấy rằng dữ liệu đã được di chuyển từ OrdersLatest bảng thành OrdersMarch bảng.

Hãy kiểm tra thông tin phân vùng cho 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];

Kết quả:

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

Như mong đợi, OrdersLatestFg3 phân vùng hiện đang trống. Điều này là do nó đã bị chuyển ra ngoài.

Hãy kiểm tra thông tin phân vùng cho OrdersMarch bảng.

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

Kết quả:

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

Một lần nữa như mong đợi, bảng OrderMarch chứa năm hàng. Chúng được lưu trữ trong phân vùng 1 (phân vùng duy nhất) trên OrdersLatest3 nhóm tệp.

Chuyển sang

Xem Chuyển đổi phân vùng trong SQL Server để biết cách chuyển đổi phân vùng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi hiệu quả ngày giữa UTC và giờ địa phương (tức là. PST) trong SQL 2005

  2. Các cách theo dõi cơ sở dữ liệu đã xóa trong SQL Server

  3. Linux - PHP 7.0 và MSSQL (Microsoft SQL)

  4. SQL Server - Bao gồm NULL bằng UNPIVOT

  5. Cách tạo bảng từ kết quả truy vấn chọn trong SQL Server 2008