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

Trả lại tất cả các hàng từ một phân vùng cụ thể trong SQL Server (T-SQL)

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

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bộ xử lý Intel được đề xuất cho SQL Server 2014 - tháng 3 năm 2015

  2. Cách di chuyển tệp dữ liệu trong SQL Server - Phần 1

  3. Cách sử dụng UPDATE từ SELECT trong SQL Server

  4. Thay đổi Dấu phân cách thành Dấu phẩy khi gửi kết quả truy vấn qua email trong SQL Server (T-SQL)

  5. CUBE OLAP đa chiều là gì và cho ví dụ về hình khối có nhiều hơn 3 kích thước