Làm cách nào để có được danh sách tất cả các bảng được phân vùng trong cơ sở dữ liệu của tôi?
Những bảng hệ thống / DMV nào tôi nên xem xét?
Làm cách nào để có được danh sách tất cả các bảng được phân vùng trong cơ sở dữ liệu của tôi?
Những bảng hệ thống / DMV nào tôi nên xem xét?
Câu trả lời:
Truy vấn này sẽ cung cấp cho bạn những gì bạn muốn:
select distinct t.name
from sys.partitions p
inner join sys.tables t
on p.object_id = t.object_id
where p.partition_number <> 1
Khung sys.partitions
nhìn danh mục cung cấp một danh sách tất cả các phân vùng cho các bảng và hầu hết các chỉ mục. Chỉ cần THAM GIA với sys.tables
để có được các bảng.
Tất cả các bảng đều có ít nhất một phân vùng, vì vậy nếu bạn đang tìm kiếm cụ thể các bảng được phân vùng, thì bạn sẽ phải lọc truy vấn này dựa trên sys.partitions.partition_number <> 1
(đối với các bảng không được phân vùng, partition_number
luôn luôn bằng 1).
partition_id
trong mệnh đề WHERE bạn cần partition_number
. Lời xin lỗi của tôi.
Methinks một truy vấn tốt hơn như sau:
select object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object],
i.name as [index],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
Cái này nhìn vào vị trí 'thích hợp' để xác định lược đồ phân vùng:, sys.partition_schemes
nó có cardinality đúng (không cần distinct
), nó chỉ hiển thị đối tượng được phân vùng (không cần where
mệnh đề lọc ), nó chiếu tên lược đồ lược đồ và tên lược đồ phân vùng. Cũng lưu ý cách truy vấn này làm nổi bật một lỗ hổng trong câu hỏi ban đầu: đó không phải là các bảng được phân vùng, mà là các chỉ mục (và điều này bao gồm chỉ số 0 và 1, còn gọi là heap và chỉ mục cụm). Một bảng có thể có nhiều chỉ mục, một số phân vùng không.
Vậy thì, cách kết hợp cả 2:
select
object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object_name],
t.name as [table_name],
i.name as [index_name],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
join sys.tables t on i.object_id = t.object_id