Bagaimana cara saya mendapatkan daftar semua tabel dipartisi di database saya?

Jawaban:

21

Kueri ini akan memberi Anda apa yang Anda inginkan:

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

Tampilan sys.partitionskatalog memberikan daftar semua partisi untuk tabel dan sebagian besar indeks. GABUNG saja dengan sys.tablesmendapatkan tabel.

Semua tabel memiliki setidaknya satu partisi, jadi jika Anda mencari secara khusus untuk tabel yang dipartisi, maka Anda harus memfilter kueri ini berdasarkan dari sys.partitions.partition_number <> 1(untuk tabel yang tidak dipartisi, partition_numberselalu sama dengan 1).

Thomas Stringer
sumber
ini mengembalikan 50 ribu objek dan sesuatu tentangnya tidak terasa benar bagi saya. Kami berada di tengah peningkatan db Peoplesoft Finance Finance dari sql 2005 hingga 2008 R2 dan tampaknya versi yang lebih baru dari alat orang tidak mendukung tabel yang dipartisi. Apakah ada cara lain untuk mengidentifikasi tabel yang dibagi?
RK Kuppala
1
@Yogirk Maaf, salah ketik. Lihat hasil edit saya. Alih-alih partition_iddalam klausa WHERE Anda yang Anda butuhkan partition_number. Permintaan maaf saya.
Thomas Stringer
Terima kasih atas hasil editnya dan saya senang ada beberapa tabel untuk diatasi, seperti yang saya harapkan :)
RK Kuppala
@yogirk Bersenang-senanglah dengan itu!
Thomas Stringer
4
Ada kesalahan di sini - tabel masih dapat dipartisi (menggunakan PF dan PS) tetapi memiliki partisi tunggal. Jadi untuk tabel tersebut kueri mengembalikan hasil yang salah
Oleg Dok
29

Memikirkan kueri yang lebih baik adalah sebagai berikut:

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

Ini terlihat di tempat yang 'tepat' untuk mengidentifikasi skema partisi:, sys.partition_schemesia memiliki kardinalitas yang tepat (tidak perlu untuk distinct), ini menunjukkan hanya objek yang dipartisi (tidak perlu untuk whereklausa penyaringan ), ia memproyeksikan nama skema dan nama skema partisi. Perhatikan juga bagaimana kueri ini menyoroti cacat pada pertanyaan asli: ini bukan tabel yang dipartisi, tetapi indeks (dan ini termasuk indeks 0 dan 1, alias heap dan indeks berkerumun). Sebuah tabel dapat memiliki beberapa indeks, beberapa yang dipartisi tidak.

Remus Rusanu
sumber
3
Ini adalah jawaban yang tepat alih-alih yang pertama - memperhitungkan jika tabelnya adalah skema partisi ON bukannya filegroup
Oleg Dok
3

Nah, kalau begitu bagaimana menggabungkan 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    
tamu
sumber