以前から調べようと思っていたのですが手が出せていなかったので。
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')
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
アーカイブテーブルにはデータを格納していなかったため、ページのアドレス (pgfirst/pgroot/pgfirstiam) が0x0 になっていたものが、スイッチしたパーティション (パーティション番号 3) の情報に変更され、スイッチしたパーティションについては 0x0 が設定されたことが確認できます。
この動作がパーティションのスイッチによりポインタ情報が変更されたということになるのではと考えています。
内部的な動作のため、意識する必要はありませんが、情報がどのように変更されるかを見るのもいろいろと理解が深まって面白いですね。