web-dev-qa-db-ja.com

データベース内のすべての分割テーブルのリストを取得するにはどうすればよいですか?

データベース内のすべての分割テーブルのリストを取得するにはどうすればよいですか?

どのシステムテーブル/ DMVを見る必要がありますか?

24
RK Kuppala

このクエリはあなたが望むものを与えるはずです:

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カタログビューには、テーブルとほとんどのインデックスのすべてのパーティションのリストが表示されます。テーブルを取得するには、sys.tablesで結合するだけです。

すべてのテーブルには少なくとも1つのパーティションがあるため、パーティションテーブルを特に探す場合は、sys.partitions.partition_number <> 1に基づいてこのクエリをフィルタリングする必要があります(パーティション化されていないテーブルの場合、partition_numberは常に1に等しい)。

22
Thomas Stringer

より良いクエリは次のとおりだと思います:

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_schemes 、それは正しいカーディナリティを持っています(distinctの必要はありません)、それはonly分割オブジェクトを示しています(必要なしフィルタリングwhere句)、スキーマ名とパーティション構成名を投影します。このクエリが元の質問の欠陥をどのように強調しているかにも注意してください:パーティション化されているのはテーブルではなくインデックスです(これには、インデックス0と1、別名ヒープとクラスター化インデックスが含まれます)。テーブルは複数のインデックスを持つことができ、いくつかはパーティション化されていません。

29
Remus Rusanu

それでは、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    
3
guest