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?


Câu trả lời:


21

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.partitionsnhì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_numberluôn luôn bằng 1).


điều này trả lại 50K đối tượng và một cái gì đó về nó không cảm thấy đúng với tôi. Chúng tôi đang ở giữa bản nâng cấp db Peoplesoft Finance từ sql 2005 lên 2008 R2 và có vẻ như phiên bản mới hơn của các công cụ không hỗ trợ các bảng được phân đoạn. Có cách nào khác để xác định các bảng được chia không?
RK Kuppala

1
@yogirk Rất tiếc, lỗi đánh máy đấy. Xem chỉnh sửa của tôi. Thay vì partition_idtrong mệnh đề WHERE bạn cần partition_number. Lời xin lỗi của tôi.
Thomas Stringer

Cảm ơn bạn đã chỉnh sửa và tôi rất vui vì có vài bàn để giải quyết, giống như tôi mong đợi :)
RK Kuppala

@yogirk Hãy vui vẻ với điều đó!
Thomas Stringer

4
Có một lỗi ở đây - bảng vẫn có thể được phân vùng (sử dụng PF và PS) nhưng có phân vùng đơn. Vì vậy, đối với các bảng đó, truy vấn trả về kết quả sai
Oleg Dok

29

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_schemesnó 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 wheremệ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.


3
Đây là câu trả lời đúng thay vì câu hỏi thứ nhất - có tính đến nếu bảng là lược đồ phân vùng BẬT thay vì filegroup
Oleg Dok

3

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    
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.