Veritabanımdaki bölümlenmiş tabloların bir listesini nasıl alabilirim?
Hangi sistem tablolarına / DMV'lere bakmalıyım?
Veritabanımdaki bölümlenmiş tabloların bir listesini nasıl alabilirim?
Hangi sistem tablolarına / DMV'lere bakmalıyım?
Yanıtlar:
Bu sorgu size istediğinizi vermelidir:
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
sys.partitions
Katalog görünümü tabloları ve çoğu endeksler için tüm bölümlerin bir listesini verir. Sadece o JOIN sys.tables
tabloları almak için.
Tüm tabloların en az bir bölümü vardır, bu nedenle özellikle bölümlenmiş tabloları arıyorsanız, o zaman bu sorguyu filtrelemeniz gerekir sys.partitions.partition_number <> 1
(bölümlenmemiş tablolar partition_number
için her zaman 1'e eşittir).
partition_id
NEREDE cümlede yerine ihtiyacınız var partition_number
. Özür dilerim.
Methin daha iyi bir sorgu aşağıdaki gibidir:
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
Bu, bölüm şemasını tanımlamak için 'uygun' yere bakar: sys.partition_schemes
doğru kardinaliteye sahiptir (gerek yok distinct
), yalnızca bölümlenmiş nesneyi gösterir (filtreleme where
maddesi gerektirmez), şema adını ve bölüm şeması adını yansıtır. Ayrıca, bu sorgunun orijinal sorudaki bir kusuru nasıl vurguladığına da dikkat edin: bölümlenmiş tablolar değil , dizinler (ve bu, dizin 0 ve 1, aka. Yığın ve kümelenmiş dizin içerir). Bir tabloda, bazılarında bölümlenmemiş birden fazla dizin olabilir.
O zaman 2'yi birleştirmeye ne dersiniz:
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