Como obtenho uma lista de todas as tabelas particionadas no meu banco de dados?

Respostas:

21

Esta consulta deve fornecer o que você deseja:

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

A sys.partitionsexibição do catálogo fornece uma lista de todas as partições para tabelas e a maioria dos índices. Apenas junte-se a isso sys.tablespara obter as mesas.

Todas as tabelas possuem pelo menos uma partição; portanto, se você estiver procurando especificamente por tabelas particionadas, terá que filtrar essa consulta com base em sys.partitions.partition_number <> 1(para tabelas não particionadas, partition_numbersempre será igual a 1).

Thomas Stringer
fonte
isso retornou 50 mil objetos e algo sobre isso não parece certo para mim. Estamos no meio de uma atualização de banco de dados da Peoplesoft Finance do sql 2005 para 2008 R2 e parece que a versão mais recente das ferramentas de pessoas não oferece suporte a tabelas particionadas. Existe alguma outra maneira de identificar as tabelas porcionadas?
RK Kuppala
1
@yogirk Sinto muito, erro de digitação lá. Veja minha edição. Em vez de partition_idna sua cláusula WHERE, você precisa partition_number. Me desculpe.
Thomas Stringer
Agradecimentos para a edição e estou feliz há algumas mesas para combater, assim como eu esperava :)
RK Kuppala
@yogirk Divirta-se com isso!
Thomas Stringer
4
Há um erro aqui - a tabela ainda pode ser particionada (usando PF e PS), mas com partição única. Assim, para essas tabelas a consulta retorna resultados errados
Oleg Dok
29

Parece que uma consulta melhor é a seguinte:

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

sys.partition_schemesEle examina o local 'adequado' para identificar o esquema de partição: possui a cardinalidade correta (sem necessidade distinct), mostra apenas o objeto particionado (sem necessidade de uma wherecláusula de filtragem ), projeta o nome do esquema e o nome do esquema de partição. Observe também como esta consulta destaca uma falha na pergunta original: não são as tabelas que são particionadas, mas os índices (e isso inclui os índices 0 e 1, também conhecido como heap e índice clusterizado). Uma tabela pode ter vários índices, alguns particionados e outros não.

Remus Rusanu
fonte
3
Esta é a resposta direita em vez da 1ª - tendo em conta se a tabela é ON esquema de partição em vez de grupo de arquivos
Oleg Dok
3

Bem, então que tal combinar o 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    
hóspede
fonte