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

Chia một phân vùng thành hai trong SQL Server (T-SQL)

Nếu bạn có một bảng hoặc chỉ mục được phân vùng trong SQL Server, nhưng bạn cần nhiều phân vùng hơn, bạn có thể thêm một phân vùng vào hàm phân vùng bằng cách sử dụng ALTER PARTITION FUNCTION câu lệnh với SPLIT RANGE đối số.

Khi bạn làm điều này, bạn chia một phân vùng hiện có thành hai.

Ví dụ

Đây là một ví dụ để chứng minh. Trước tiên, hãy xem thiết lập hiện tại của chúng tôi.

Thiết lập hiện tại

Chúng tôi đã có bốn phân vùng và chúng tôi muốn thêm một phần năm.

Vì vậy, chúng tôi đã tạo một chức năng phân vùng như sau:

CREATE PARTITION FUNCTION MoviesPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (-1, 100, 10000);

Đoạn mã này dẫn đến các phân vùng lưu trữ các giá trị như sau.

Phân vùng Giá trị
1 <=- 1
2 > - 1 VÀ <=100
3 > 100 VÀ <=10000
4 > 10000

Đối với ví dụ này, chúng tôi sẽ thêm giá trị ranh giới mới là 500.

Vì vậy, chúng tôi muốn nó trông như thế này:

Phân vùng Giá trị
1 <=- 1
2 > - 1 VÀ <=100
3 > 100 VÀ <=500
4 > 500 VÀ <=10000
5 > 10000

Ngoài ra, với mục đích của ví dụ này, hãy tưởng tượng chúng ta có bảng được phân vùng bằng cách sử dụng hàm phân vùng ở trên và nó hiện chỉ chứa hơn bốn nghìn hàng dữ liệu.

Hãy xem nhanh cách các hàng được phân phối trên các phân vùng của chúng ta:

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');

Kết quả:

+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 0           |
| 2                  | 100         |
| 3                  | 3979        |
| 4                  | 0           |
+--------------------+-------------+

Vì vậy, bây giờ chúng tôi muốn thêm một phân vùng mới với giá trị ranh giới là 500.

Trong trường hợp này, chúng tôi sẽ chia phân vùng giữa các giá trị ranh giới 100 và 10000.

Tôi nên đề cập rằng Microsoft khuyến cáo không nên chia nhỏ các phân vùng đông dân cư. Vì vậy, đó là điều cần ghi nhớ.

Tuy nhiên, với mục đích của ví dụ này, chúng tôi sẽ chia một phân vùng có chứa dữ liệu.

Tách phân vùng

Đây là nơi chúng ta tiếp tục và tách phân vùng.

Chúng tôi sử dụng ALTER PARTITION FUNCTION để chia nhỏ phân vùng.

Tuy nhiên, việc chia nhỏ một phân vùng sẽ tạo ra hai phân vùng trong một và vì vậy chúng ta cần đảm bảo có một nhóm tệp cho phân vùng mới. Chúng tôi cũng cần đảm bảo rằng lược đồ phân vùng của chúng tôi biết nhóm tệp nào sẽ sử dụng khi chúng tôi chia phân vùng.

Bạn có thể sử dụng một nhóm tệp hiện có hoặc bạn có thể tạo một nhóm mới.

Hãy tạo một cái mới.

Đây là mã chúng tôi có thể sử dụng để thực hiện tất cả những điều trên:

ALTER DATABASE Test ADD FILEGROUP MoviesFg5;

ALTER DATABASE Test   
ADD FILE   
(  
    NAME = MoviesFg5dat,  
    FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB  
)  
TO FILEGROUP MoviesFg5;

ALTER PARTITION SCHEME MoviesPartitionScheme  
NEXT USED MoviesFg5;

ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500);

Kết quả:

Commands completed successfully.

Chúng tôi đã chia thành công phân vùng.

Xác minh sự phân tách

Bây giờ chúng tôi có thể xác minh rằng chức năng phân vùng đã được sửa đổi để phản ánh các giá trị ranh giới mới.

SELECT 
    prv.boundary_id,
    prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';

Kết quả:

+---------------+---------+
| boundary_id   | value   |
|---------------+---------|
| 1             | -1      |
| 2             | 100     |
| 3             | 500     |
| 4             | 10000   |
+---------------+---------+

Vì vậy, chúng tôi có thể thấy rằng giá trị ranh giới mới đã được thêm thành công.

Và đây là cách dữ liệu hiện được phân phối trên các phân vùng.

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');

Kết quả:

+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 0           |
| 2                  | 100         |
| 3                  | 400         |
| 4                  | 3579        |
| 5                  | 0           |
+--------------------+-------------+

Vì vậy, bây giờ chúng ta có 5 phân vùng.

Tại sao lại có phân vùng trống?

Nếu bạn đang thắc mắc tại sao tôi có các phân vùng trống ở mỗi đầu, thì điều này được thực hiện đặc biệt để tạo điều kiện cho việc chia nhỏ và hợp nhất các phân vùng.

Giữ cho các phân vùng trống ở mỗi đầu ngăn bất kỳ chuyển động dữ liệu không mong muốn nào mà bạn có thể nhận được khi chia hoặc hợp nhất các phân vùng.

Phương pháp này cũng được Microsoft khuyến nghị, chính xác là vì lý do này.

Tách các phân vùng chứa dữ liệu

Như đã đề cập, Microsoft khuyến cáo không nên chia nhỏ các phân vùng đã chứa dữ liệu.

Việc chia tách hoặc hợp nhất các phân vùng đông dân cư có thể không hiệu quả. Chúng có thể không hiệu quả vì việc tách hoặc hợp nhất có thể gây ra lượng nhật ký nhiều hơn gấp bốn lần và cũng có thể gây khóa nghiêm trọ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. Sử dụng sự kiện mở rộng để ghi nhật ký Các tính năng không được dùng nữa đang được sử dụng trong phiên bản máy chủ SQL (Ví dụ T-SQL)

  2. Cách tốt nhất để tự động tạo câu lệnh INSERT cho bảng SQL Server là gì?

  3. Cách điều chỉnh hiệu suất của SQL Server, Azure SQL Database và Amazon RDS

  4. Xóa cấu hình thư cơ sở dữ liệu (SSMS)

  5. Thủ tục được lưu trữ - trả về danh tính dưới dạng tham số đầu ra hoặc đại lượng vô hướng