データベース内のすべての分割テーブルのリストを取得するにはどうすればよいですか?
どのシステムテーブル/ DMVを見る必要がありますか?
このクエリはあなたが望むものを与えるはずです:
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に等しい)。
より良いクエリは次のとおりだと思います:
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、別名ヒープとクラスター化インデックスが含まれます)。テーブルは複数のインデックスを持つことができ、いくつかはパーティション化されていません。
それでは、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