SE の雑記

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

パーティションをスイッチした際の内部テーブルの変化を確認してみる

leave a comment

以前から調べようと思っていたのですが手が出せていなかったので。
SQL Server 2005 以降は Enterprise Edition でパーティショニングが使用できるようになり、アーカイブテーブルへのスイッチが瞬時に実行できるようになりました。
これにより大量のデータを格納しているテーブルに対して、効率よくデータを移動することができます。

パーティションのスイッチではよく

  • ポインターのみを変更することで瞬時にデータをパージする

というようなことを聞くかと思いますが、この内部的な動作が気になったので、内部テーブルのレコードの変化を確認してみました。

以下のようなテーブルがあります。

SELECT 
	OBJECT_NAME(object_id) ObjectName
	, index_id
	, partition_number
	, row_count 
FROM 
	sys.dm_db_partition_stats
WHERE
	OBJECT_NAME(object_id) IN('PartitionTable', 'ArchiveTable')

image

PartitionTable の一部のパーティションを以下のクエリで ArchiveTable にスイッチしてみたいと思います。

ALTER TABLE PartitionTable
SWITCH PARTITION 3
TO ArchiveTable

 

パーティションのスイッチ前に内部テーブルの情報を取得したものが以下になります。

# 以下のクエリで使用しているテーブルは通常アクセスできないものですので、DAC (ADMIN:) で接続する必要があります。

SELECT 
	object_name(sr.idmajor) ObjectName
	, sr.numpart
	, rcrows
	, sa.pgfirst
	, sa.pgroot
	, sa.pgfirstiam
FROM 
	sys.sysrowsets sr
	LEFT JOIN
	sys.sysallocunits sa
	ON
	sr.rowsetid = sa.ownerid
WHERE 
	object_name(sr.idmajor) IN('PartitionTable', 'ArchiveTable')
ORDER BY
	sr.idmajor
	,sr.numpart

 

image

パーティションをスイッチすることで以下のようになります。

image

アーカイブテーブルにはデータを格納していなかったため、ページのアドレス (pgfirst/pgroot/pgfirstiam) が0x0 になっていたものが、スイッチしたパーティション (パーティション番号 3) の情報に変更され、スイッチしたパーティションについては 0x0 が設定されたことが確認できます。

この動作がパーティションのスイッチによりポインタ情報が変更されたということになるのではと考えています。

内部的な動作のため、意識する必要はありませんが、情報がどのように変更されるかを見るのもいろいろと理解が深まって面白いですね。

Written by masayuki.ozawa

8月 25th, 2014 at 9:14 pm

Posted in SQL Server

Tagged with

Leave a Reply

*