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

Cách ánh xạ nhiều phân vùng thành một nhóm tệp trong SQL Server (T-SQL)

Nếu bạn đã quen với việc tạo các bảng được phân vùng trong SQL Server, bạn có thể quen với việc tạo một nhóm tệp riêng biệt cho từng phân vùng. Điều này có những lợi ích của nó và rất có thể là phương pháp bạn sẽ chọn trong hầu hết các tình huống.

Tuy nhiên, bạn cũng có tùy chọn ánh xạ nhiều phân vùng vào một nhóm tệp duy nhất.

Trong bài viết này, tôi chia sẻ hai ví dụ về ánh xạ nhiều phân vùng vào một nhóm tệp duy nhất.

  • Ví dụ 1 bản đồ tất cả phân vùng cho một nhóm tệp duy nhất.
  • Ví dụ 2 ánh xạ một số phân vùng tới một nhóm tệp và một số phân vùng sang nhóm khác.

Ví dụ 1 - Ánh xạ tất cả các phân vùng thành một nhóm tệp duy nhất

Để ánh xạ tất cả các phân vùng vào một nhóm tệp, hãy sử dụng đối số TẤT CẢ. Điều này chỉ định rằng tất cả các phân vùng ánh xạ tới nhóm tệp được chỉ định hoặc đến nhóm tệp chính nếu [PRIMARY] được chỉ định.

Lưu ý rằng khi ALL được chỉ định, chỉ có thể chỉ định một nhóm tệp.

-- Create one filegroup
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

-- Create a partition function that will result in twelve partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401', 
        '20200501',
        '20200601',
        '20200701',
        '20200801',
        '20200901',
        '20201001',
        '20201101',
        '20201201'
    );
GO

-- Create a partition scheme that maps all partitions to the OrdersNewFg1 filegroup
CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    ALL TO (OrdersNewFg1);  
GO

-- Create a partitioned table
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

Ở đây, tôi đã làm như sau:

  • Đã tạo một nhóm tệp và tệp được liên kết
  • Đã tạo một chức năng phân vùng
  • Đã tạo một lược đồ phân vùng
  • Đã tạo một bảng sử dụng lược đồ phân vùng đó

Phần quan trọng là dòng cuối cùng của CREATE PARTITION SCHEME tuyên bố. Cụ thể, đó là ALL từ khóa ánh xạ tất cả các phân vùng tới nhóm tệp được chỉ định.

Nếu bạn đang ánh xạ chúng đến nhiều nhóm tệp, bạn sẽ bỏ qua ALL , sau đó có danh sách các nhóm tệp được phân tách bằng dấu phẩy thay vì chỉ một nhóm.

Kiểm tra ánh xạ

Chúng tôi có thể sử dụng truy vấn sau để xác minh rằng mỗi phân vùng được ánh xạ tới cùng một nhóm tệp.

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

Kết quả:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg1 | 0      |
| 3           | OrdersNewFg1 | 0      |
| 4           | OrdersNewFg1 | 0      |
| 5           | OrdersNewFg1 | 0      |
| 6           | OrdersNewFg1 | 0      |
| 7           | OrdersNewFg1 | 0      |
| 8           | OrdersNewFg1 | 0      |
| 9           | OrdersNewFg1 | 0      |
| 10          | OrdersNewFg1 | 0      |
| 11          | OrdersNewFg1 | 0      |
| 12          | OrdersNewFg1 | 0      |
+-------------+--------------+--------+

Truy vấn này cũng cho chúng ta biết có bao nhiêu hàng trong mỗi phân vùng. Chúng tôi chưa chèn bất kỳ dữ liệu nào nên chúng hoàn toàn bằng không.

Ví dụ 2 - Ánh xạ một số phân vùng thành một nhóm tệp đơn

Ví dụ này gần giống với ví dụ trước, ngoại trừ việc chúng tôi ánh xạ mười hai phân vùng trên hai nhóm tệp riêng biệt.

Trong trường hợp này, chúng tôi bỏ qua ALL đối số, vì chỉ có thể chỉ định một nhóm tệp khi ALL được chỉ định.

-- Create two 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

-- Create a partition function that will result in twelve partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401', 
        '20200501',
        '20200601',
        '20200701',
        '20200801',
        '20200901',
        '20201001',
        '20201101',
        '20201201'
    );
GO

-- Create a partition scheme that maps all partitions to the OrdersNewFg1 filegroup
CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    TO (
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2
        );  
GO

-- Create a partitioned table
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

Kiểm tra ánh xạ

Hãy xem cách các phân vùng được ánh xạ tới các nhóm tệp.

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

Kết quả:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg1 | 0      |
| 3           | OrdersNewFg1 | 0      |
| 4           | OrdersNewFg1 | 0      |
| 5           | OrdersNewFg1 | 0      |
| 6           | OrdersNewFg1 | 0      |
| 7           | OrdersNewFg2 | 0      |
| 8           | OrdersNewFg2 | 0      |
| 9           | OrdersNewFg2 | 0      |
| 10          | OrdersNewFg2 | 0      |
| 11          | OrdersNewFg2 | 0      |
| 12          | OrdersNewFg2 | 0      |
+-------------+--------------+--------+

Như mong đợi, sáu phân vùng đầu tiên được ánh xạ tới nhóm tệp đầu tiên và phần còn lại được ánh xạ tới phân vùng thứ hai.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiệu suất tổng hợp có điều kiện

  2. Truy vấn để chỉ lấy số từ một chuỗi

  3. Tôi có thể sử dụng nhiều con trỏ trên một kết nối với pyodbc và MS SQL Server không?

  4. Tại sao điều chỉnh hiệu suất SQL là kỹ năng quản lý cơ sở dữ liệu quan trọng nhất cần có

  5. Triển khai Tìm kiếm toàn văn bản trong SQL Server 2016 cho người mới bắt đầu