Veritabanımdaki bölümlenmiş tabloların bir listesini nasıl alabilirim?


Yanıtlar:


21

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.partitionsKatalog görünümü tabloları ve çoğu endeksler için tüm bölümlerin bir listesini verir. Sadece o JOIN sys.tablestabloları 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_numberiçin her zaman 1'e eşittir).


Bu 50K nesneler döndürdü ve bu konuda bir şey bana doğru gelmiyor. Bir Peoplesoft Finance db'nin 2005 sql'den 2008 R2'ye yükselttiğinin ortasındayız ve insan araçlarının daha yeni sürümleri bölümlenmiş tabloları desteklemiyor gibi görünüyor. Bölümlenmiş tabloları tanımlamanın başka bir yolu var mı?
RK Kuppala

1
@ yogirk Çok üzgünüm, orada yazım hatası. Düzenlemeye bak. partition_idNEREDE cümlede yerine ihtiyacınız var partition_number. Özür dilerim.
Thomas Stringer

Düzenleme için teşekkürler ve beklediğim gibi
çözülmesi

@yogirk Bununla eğlenin!
Thomas Stringer

4
Burada bir hata var - tablo hala bölümlenebilir (PF ve PS kullanarak) ancak tek bölüme sahip. Yani bu tablolar için sorgu yanlış sonuçlar
Oleg Dok

29

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_schemesdoğru kardinaliteye sahiptir (gerek yok distinct), yalnızca bölümlenmiş nesneyi gösterir (filtreleme wheremaddesi 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.


3
Bu, ilk cevap yerine doğru cevaptır - tablonun dosya grubu yerine açık bölüm planının olup olmadığını hesaba katar
Oleg Dok

3

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    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.