Trong SQL Server, bạn có thể sử dụng ALTER PARTITION FUNCTION
để hợp nhất hai phân vùng thành một phân vùng.
Để thực hiện việc này, hãy sử dụng MERGE RANGE
đối số, đồng thời cung cấp giá trị ranh giới của phân vùng sẽ giảm xuống.
Thao tác này bỏ phân vùng và hợp nhất bất kỳ giá trị nào tồn tại trong phân vùng vào một phân vùng còn lại.
Ví dụ
Hãy tưởng tượng chúng ta có năm phân vùng mà chúng ta muốn trở thành bốn.
Phân vùng hiện tại
Chúng tôi có một chức năng phân vùng được gọi là MoviesPartitionFunction
với bốn giá trị ranh giớ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 | +---------------+---------+
Điều này có nghĩa là có năm phân vùng.
Đối với ví dụ này, chúng tôi sẽ giảm phạm vi ranh giới 500.
Ngoài ra, hãy tưởng tượng chúng ta đã có một bảng với dữ liệu được phân phối trên một số phân vùng này.
Đây là cách các hàng 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 | +--------------------+-------------+
Tôi nên chỉ ra rằng Microsoft thực sự khuyên không nên hợp nhất (hoặc chia nhỏ) các phân vùng có chứa dữ liệu. Tuy nhiên, đối với mục đích của ví dụ này, chúng tôi sẽ thận trọng với luồng gió và hợp nhất hai phân vùng có chứa dữ liệu.
Hợp nhất các phân vùng
Được rồi, hãy hợp nhất các phân vùng.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Kết quả:
Commands completed successfully.
Chúng tôi đã hợp nhất các phân vùng thành công.
Kiểm tra kết quả
Hãy kiểm tra kết quả.
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 | 10000 | +---------------+---------+
Như dự kiến, phạm vi ranh giới 500 đã bị loại bỏ và chúng tôi chỉ còn lại ba phạm vi ranh giới.
Hãy xem cách dữ liệu đượ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 | 3979 | | 4 | 0 | +--------------------+-------------+
Một lần nữa như mong đợi, dữ liệu từ phân vùng 3 và 4 đã hợp nhất thành một phân vùng (phân vùng 3).
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.
Hợp nhất các phân vùng chứa dữ liệu
Như đã đề cập, Microsoft khuyến cáo không nên hợp nhất 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.