SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Data Warehouse のディストリビューション/パーティション単位のデータ件数の確認

leave a comment

はじめに書いてしまうと、DBCC PDW_SHOWSPACEUSED (SQL Data Warehouse) / DBCC PDW_SHOWPARTITIONSTATS (SQL Data Warehouse) で見るのが素直な方法です。

今回はサンプルの「FactInternetSales」を例にして情報を取得してみたいと思います。

SQLDW では、ディストリビューションという単位にデータが分散されて格納が行われます。
パーティショニングも併用することができますので、ディストリビューションに分割されている内部をさらにパーティショニングで分割することが可能です。

ディストリビューションを考慮せずに、各パーティションのデータ件数を取得したい場合には、以下のクエリで取得することができます。

select * from sys.partitions where object_name(object_id) = 'FactInternetSales'

 

image

ディストリビューションを考慮して件数を取得したい場合には、「sys.dm_pdw_nodes_db_partition_stats」を元に件数を取得するか「DBCC PDW_SHOWSPACEUSED」/ 「DBCC PDW_SHOWPARTITIONSTATS」を使用することになるかと。

DBCC PDW_SHOWSPACEUSED は、ディストリビューション単位の件数を取得することができます。

DBCC PDW_SHOWSPACEUSED('dbo.FactInternetSales')

image

DBCC PDW_SHOWPARTITIONSTATS は、ディストリビューション / パーティション単位の件数を取得することができます。

DBCC PDW_SHOWPARTITIONSTATS('dbo.FactInternetSales')

image

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

image

通常の 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 と、うまく対応しないのがちょっと気になりますね。

Share

Written by Masayuki.Ozawa

12月 23rd, 2015 at 11:01 pm

Posted in SQL Database

Tagged with

Leave a Reply