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

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

Trong SQL Server, bạn có thể chuyển đổi các phân vùng vào và ra khỏi một bảng được phân vùng.

Bạn có thể thực hiện việc này với ALTER TABLE tuyên bố. Về cơ bản, nó diễn ra như thế này:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

Thao tác này sẽ chuyển phân vùng cho OldTable vào phân vùng x trong tổng số NewTable (trong đó x là số phân vùng).

Ví dụ

Trước khi bắt đầu chuyển sang, chúng ta hãy thiết lập hai bảng. Một (được gọi là OrdersOld ) sẽ chứa dữ liệu mà chúng tôi muốn “chuyển sang” bảng khác (được gọi là OrdersNew ).

Chúng tôi sẽ phân vùng OrdersNew thành bốn phân vùng.

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

Kết quả:

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

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

Vì vậy, như hiện tại, OrdersOld chứa 5 hàng và OrdersNew trống.

Đã đến lúc chuyển đổi dữ liệu.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Kết quả:

Commands completed successfully.

Dữ liệu hiện đã được chuyển thành công sang phân vùng 3 của bảng đích.

Hãy kiểm tra lại cả hai bảng.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Kết quả:

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

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

Lần này OrdersOld trống và OrdersNew chứa 5 hàng.

Chúng tôi cũng có thể chạy truy vấn sau để kiểm tra phân vùng thực tế chứa dữ liệ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('OrdersNew')
ORDER BY [Partition];

Kết quả:

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

Như mong đợi, tất cả 5 hàng được phân bổ cho phân vùng 3, trong OrdersNewFg3 nhóm tệp.

Các lỗi thường gặp

Lỗi 4982

Trong ví dụ của tôi ở trên, bạn sẽ nhận thấy rằng tôi đã tạo CHECK ràng buộc khi tạo OrdersOld bảng.

Nếu bạn nhận được thông báo lỗi 4982 (ALTER TABLE SWITCH statement failed... ), có thể là bạn chưa tạo CHECK ràng buộc trên bảng nguồn.

Hoặc có thể bạn đã tạo CHECK nhưng nó không thực thi các giá trị giữa phạm vi của phân vùng chuyển đổi.

Bạn cần đảm bảo rằng các giá trị chuyển đổi trên thực tế nằm trong phạm vi được phân vùng xác định và SQL Server sẽ tìm kiếm CHECK ràng buộc trên bảng nguồn xác minh điều này.

Lỗi 4939

Một lỗi phổ biến khác là lỗi 4939 (ALTER TABLE SWITCH statement failed... ).

Nếu bạn gặp lỗi này, có thể là do bạn đang cố chuyển sang phân vùng sử dụng nhóm tệp khác với bảng nguồn.

Một trong những yêu cầu của việc chuyển đổi phân vùng là cả bảng hoặc phân vùng nguồn và bảng hoặc phân vùng đích phải được đặt trong cùng một nhóm tệp.

Để khắc phục lỗi này, hãy đảm bảo rằng bảng nguồn sử dụng cùng một nhóm tệp với phân vùng đích.

Chuyển ra

Xem Chuyển ra một phân vùng trong SQL Server để biết cách chuyển một 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. Câu lệnh UPDATE xung đột với ràng buộc THAM KHẢO - Hướng dẫn SQL Server / TSQL Phần 76

  2. Xóa SCHEMABINDING khỏi một hàm do người dùng xác định trong SQL Server

  3. Nhận kích thước của tất cả các bảng trong cơ sở dữ liệu

  4. Cách xác định tổng số kết nối đang mở / hoạt động trong ms sql server 2005

  5. Các kỹ thuật tối ưu hóa truy vấn trong SQL Server:5 phương pháp hay nhất để tăng hiệu suất truy vấn