Come posso ottenere un elenco di tutte le tabelle partizionate nel mio database?


Risposte:


21

Questa query dovrebbe darti quello che vuoi:

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

La sys.partitionsvista del catalogo fornisce un elenco di tutte le partizioni per le tabelle e la maggior parte degli indici. Unisciti a quello con sys.tablesper ottenere i tavoli.

Tutte le tabelle hanno almeno una partizione, quindi se stai cercando specificamente tabelle partizionate, dovrai filtrare questa query in base a sys.partitions.partition_number <> 1(per le tabelle non partizionate, partition_numberè sempre uguale a 1).


questo ha restituito 50.000 oggetti e qualcosa al riguardo non mi sembra giusto. Siamo nel bel mezzo di un aggiornamento db Peoplesoft Finance da sql 2005 a 2008 R2 e sembra che la versione più recente degli strumenti di persone non supporti le tabelle partizionate. Esiste un altro modo per identificare le tabelle porzionate?
RK Kuppala,

1
@yogirk Mi dispiace, errore di battitura lì. Vedi la mia modifica. Invece che partition_idnella clausola WHERE di cui hai bisogno partition_number. Mie scuse.
Thomas Stringer

Grazie per la modifica e sono contento che ci siano pochi tavoli da affrontare, proprio come mi aspettavo :)
RK Kuppala

@yogirk Divertiti con quello!
Thomas Stringer

4
C'è un errore qui - la tabella è ancora può essere partizionata (usando PF e PS) ma con una singola partizione. Quindi per quelle tabelle la query restituisce risultati errati
Oleg Dok,

29

Pensa che una query migliore sia la seguente:

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

Questo esamina il posto "corretto" per identificare lo schema di partizione: sys.partition_schemesha la giusta cardinalità (non è necessario distinct), mostra solo oggetti partizionati (non è necessaria una whereclausola di filtro ), proietta il nome dello schema e il nome dello schema di partizione. Nota anche come questa query evidenzi un difetto sulla domanda originale: non sono le tabelle che sono partizionate, ma gli indici (e questo include gli indici 0 e 1, alias. Heap e indice cluster). Una tabella può avere più indici, alcuni partizionati altri no.


3
Questa è la risposta giusta invece della prima - tenendo conto se la tabella è ON schema di partizione anziché filegroup
Oleg Dok

3

Bene, allora che ne dici di combinare il 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    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.