Khi bạn tạo một bảng được phân vùng trong SQL Server, bạn chỉ định giá trị nào đi vào mỗi phân vùng.
Điều này được thực hiện khi bạn tạo chức năng phân vùng. Khi bạn tạo hàm phân vùng, bạn chỉ định các giá trị ranh giới, xác định giá trị nào đi vào mỗi phân vùng.
Khi bạn đã tạo bảng được phân vùng và đã chèn dữ liệu, bạn có thể chạy SELECT
bình thường để trả về dữ liệu, giống như cách bạn làm với bảng không được phân vùng (trên thực tế, ngay cả các bảng không được phân vùng cũng có một phân vùng).
Nhưng bạn có biết rằng bạn cũng có thể chỉ định phân vùng mà bạn muốn dữ liệu từ đó không?
Bạn có thể thực hiện việc này với sự trợ giúp của $PARTITION
chức năng hệ thống trong WHERE
của bạn mệnh đề.
Ví dụ
Hãy tưởng tượng chúng ta có một bảng được phân vùng chứa dữ liệu sau:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
Và CatId
là cột phân vùng.
Và chúng tôi đã sử dụng hàm phân vùng sau để tạo các phân vùng của nó:
CREATE PARTITION FUNCTION CatsPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 5, 100);
Điều này cho chúng tôi biết cách dữ liệu được lưu trữ, theo các giá trị trong cột phân vùng.
Vì vậy, bây giờ chúng ta có thể chạy một truy vấn chỉ trả về dữ liệu từ một phân vùng cụ thể.
Trả lại dữ liệu từ phân vùng thứ hai
Đây là cách chúng tôi có thể trả về tất cả các hàng từ phân vùng thứ hai.
SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 2;
Kết quả:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | +---------+-------------+
Trả lại dữ liệu từ phân vùng thứ ba
Và đây là tất cả dữ liệu từ phân vùng thứ ba.
SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 3;
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-----------+
Trả lại dữ liệu từ các phân vùng đầu tiên và cuối cùng
Trong trường hợp này, phân vùng đầu tiên của tôi trống vì không có giá trị âm nào trong CatId
cột.
SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 1;
Kết quả:
(0 rows affected)
Tương tự, phân vùng cuối cùng cũng trống do không có đủ hàng để điền phân vùng đó.
SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 4;
Kết quả:
(0 rows affected)
Điều này tuân theo khuyến nghị của Microsoft về việc để trống phân vùng đầu tiên và cuối cùng để tránh bất kỳ sự di chuyển dữ liệu nào trong trường hợp các phân vùng được chia hoặc hợp nhất trong tương lai.