はじめに書いてしまうと、DBCC PDW_SHOWSPACEUSED (SQL Data Warehouse) / DBCC PDW_SHOWPARTITIONSTATS (SQL Data Warehouse) で見るのが素直な方法です。
今回はサンプルの「FactInternetSales」を例にして情報を取得してみたいと思います。
SQLDW では、ディストリビューションという単位にデータが分散されて格納が行われます。
パーティショニングも併用することができますので、ディストリビューションに分割されている内部をさらにパーティショニングで分割することが可能です。
ディストリビューションを考慮せずに、各パーティションのデータ件数を取得したい場合には、以下のクエリで取得することができます。
select * from sys.partitions where object_name(object_id) = 'FactInternetSales'
ディストリビューションを考慮して件数を取得したい場合には、「sys.dm_pdw_nodes_db_partition_stats」を元に件数を取得するか「DBCC PDW_SHOWSPACEUSED」/ 「DBCC PDW_SHOWPARTITIONSTATS」を使用することになるかと。
DBCC PDW_SHOWSPACEUSED は、ディストリビューション単位の件数を取得することができます。
DBCC PDW_SHOWSPACEUSED('dbo.FactInternetSales')
DBCC PDW_SHOWPARTITIONSTATS は、ディストリビューション / パーティション単位の件数を取得することができます。
DBCC PDW_SHOWPARTITIONSTATS('dbo.FactInternetSales')
DMV から取得する場合ですが、「sys.pdw_table_mappings」を挟んで検索をする必要があります。
select tm.object_id,nt.object_id as nt_object_id,object_name(tm.object_id) as object_name, physical_name, pdw_node_id, distribution_id from sys.pdw_table_mappings tm inner join sys.pdw_nodes_tables nt on tm.physical_name = nt.name where object_name(tm.object_id) = 'FactInternetSales' order by distribution_id
通常の object_id では、各ディストリビューションに格納されている内部的な物理テーブル名とは紐づかないため、一度マッピングテーブルを介してから検索を行う必要があります。
select tm.object_name, dps.* from sys.dm_pdw_nodes_db_partition_stats dps inner join ( select tm.object_id,nt.object_id as nt_object_id,object_name(tm.object_id) as object_name from sys.pdw_table_mappings tm inner join sys.pdw_nodes_tables nt on tm.physical_name = nt.name group by tm.object_id,nt.object_id ,object_name(tm.object_id) ) as tm on dps.object_id = tm.nt_object_id where object_name = 'FactInternetSales' order by partition_number, distribution_id
sys.partitions と、うまく対応しないのがちょっと気になりますね。