none
カタログビューでテーブルが作成されているファイルグループを確認する方法 RRS feed

  • 質問

  • SQL Server2008のカタログビューで各テーブルがどのファイルグループに作成されているかを確認する方法はないでしょうか?

    パーティション分割されているテーブルであれば、sys.dm_db_partition_statsを介してsys.tablesとsys.filegroupsを結合することで確認できると思われますし、LOBを格納しているファイルグループやファイルストリームファイルグループを使用しているテーブルであれば、lob_data_space_idやfilestream_data_space_idを使ってsys.tablesとsys.filegroupsを結合することで確認できると思うのですが、パーティション分割されておらず、LOBを保持せず、ファイルストリームファイルグループを使用していないテーブルが作成されているファイルグループの確認方法を見つけることができませんでした。

     

    2011年6月30日 2:05

回答

  • パーティション分割しているテーブルが含まれた状態では確認ができていませんが、以下のようなクエリではいかがでしょうか?

    SELECT DISTINCT
    
    	sp.object_id,
    
    	OBJECT_NAME(sp.object_id),
    
    	sa.data_space_id,
    
    	sf.name
    
    FROM
    
    	sys.allocation_units AS sa
    
    	LEFT JOIN
    
    	sys.partitions AS sp
    
    	ON
    
    	sa.container_id = sp.partition_id
    
    	LEFT JOIN
    
    	sys.filegroups AS sf
    
    	ON
    
    	sa.data_space_id = sf.data_space_id
    
    

    こちらのようなシンプルなクエリでも取得できるかと思います。

    SELECT
    	si.name,
    	ds.name
    FROM
    	sys.indexes AS si
    	LEFT JOIN
    	sys.data_spaces as ds
    	ON
    	si.data_space_id = ds.data_space_id

    また、sys.sp_objectfilegroup というストアドプロシージャを使用すると、オブジェクト ID を渡すことでファイルグループを確認することが可能です。

    DECLARE @object_id int =OBJECT_ID(N’dbo.Table_1′) 
    
    EXEC sys.sp_objectfilegroup @object_id
    
    

    こちらのストアドプロシージャの内容については、

    sp_helptext 'sys.sp_objectfilegroup'

    で確認ができますので、参考になるかと思います。
    # sys.indexes と sys.data_spaces を元に情報を出力しているようです。

    ご参考になれば幸いです。


    • 回答としてマーク tenmanten 2011年6月30日 4:50
    2011年6月30日 4:23
    モデレータ

すべての返信

  • パーティション分割しているテーブルが含まれた状態では確認ができていませんが、以下のようなクエリではいかがでしょうか?

    SELECT DISTINCT
    
    	sp.object_id,
    
    	OBJECT_NAME(sp.object_id),
    
    	sa.data_space_id,
    
    	sf.name
    
    FROM
    
    	sys.allocation_units AS sa
    
    	LEFT JOIN
    
    	sys.partitions AS sp
    
    	ON
    
    	sa.container_id = sp.partition_id
    
    	LEFT JOIN
    
    	sys.filegroups AS sf
    
    	ON
    
    	sa.data_space_id = sf.data_space_id
    
    

    こちらのようなシンプルなクエリでも取得できるかと思います。

    SELECT
    	si.name,
    	ds.name
    FROM
    	sys.indexes AS si
    	LEFT JOIN
    	sys.data_spaces as ds
    	ON
    	si.data_space_id = ds.data_space_id

    また、sys.sp_objectfilegroup というストアドプロシージャを使用すると、オブジェクト ID を渡すことでファイルグループを確認することが可能です。

    DECLARE @object_id int =OBJECT_ID(N’dbo.Table_1′) 
    
    EXEC sys.sp_objectfilegroup @object_id
    
    

    こちらのストアドプロシージャの内容については、

    sp_helptext 'sys.sp_objectfilegroup'

    で確認ができますので、参考になるかと思います。
    # sys.indexes と sys.data_spaces を元に情報を出力しているようです。

    ご参考になれば幸いです。


    • 回答としてマーク tenmanten 2011年6月30日 4:50
    2011年6月30日 4:23
    モデレータ
  • Masayuki.Ozawaさん

    情報のご提供ありがとうございます。sys.allocation_unitsというカタログビューが存在していたのですね。早速試したところ、確認することができました。

    sys.indexesから検索する方法も参考になりました。本当にありがとうございました。

    2011年6月30日 4:50