Nếu bạn cần tìm hiểu xem một bảng đã được phân vùng trong SQL Server hay chưa, bạn có thể chạy một phép nối với sys.tables
, sys.indexes
và sys.partition_schemes
lượt xem.
Ví dụ
Đây là một ví dụ để chứng minh.
SELECT
t.name AS [Table],
i.name AS [Index],
i.type_desc,
i.is_primary_key,
ps.name AS [Partition Scheme]
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
AND i.type IN (0,1)
INNER JOIN sys.partition_schemes ps
ON i.data_space_id = ps.data_space_id
WHERE t.name = 'Movies';
Kết quả:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Ở đây, nó lại sử dụng đầu ra theo chiều dọc (để bạn không phải cuộn sang ngang):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Tôi chỉ trả về một tập hợp con nhỏ của các cột thực tế, nhưng bạn có thể trả lại bất kỳ cột nào mà bạn quan tâm.
Ngoài ra, bạn có thể xóa dòng cuối cùng để trả về tất cả các bảng được phân vùng.
SELECT
t.name AS [Table],
i.name AS [Index],
i.type_desc,
i.is_primary_key,
ps.name AS [Partition Scheme]
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
AND i.type IN (0,1)
INNER JOIN sys.partition_schemes ps
ON i.data_space_id = ps.data_space_id;
Kết quả:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Trong trường hợp của tôi, chỉ có một bảng được phân vùng trong cơ sở dữ liệu.
Chỉ cần rõ ràng, điều này chỉ trả về các bảng đã được phân vùng rõ ràng.
Trả lại các phân vùng
Bạn cũng có thể truy vấn các dạng xem khác, chẳng hạn như sys.partitions
và sys.dm_db_partition_stats
để trả về danh sách các phân vùng cho mỗi bảng.
Lưu ý rằng cả hai chế độ xem này cũng sẽ trả về các bảng chưa được phân vùng rõ ràng (tức là chúng chỉ có một phân vùng). Trong SQL Server, các bảng và dạng xem chưa được phân vùng rõ ràng vẫn có một phân vùng (partition_number
=1).
Đây là một ví dụ về sys.dm_db_partition_stats
:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');
Kết quả:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Đây là một ví dụ mà tôi trả về thông tin phân vùng cho một bảng không được phân vùng.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');
Kết quả:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 3 | +--------------------+-------------+
Như đã đề cập, nó vẫn có một phân vùng và partition_number
của nó là 1
.