SQL Server 2008 R2 では Unicode 圧縮という機能が追加されました。
この機能を使用すると可変長の列 (nvarchar) に対して行圧縮を設定した場合でも、行サイズを減少することが可能となります。
今回の投稿では DBCC PAGE を使用して、Unicode 圧縮の動作を確認してみたいと思います。
■圧縮前後のテーブルのサイズを確認
以下のテーブルを作成し、同一のデータを INSERT してテーブルのサイズを比較してみます。
SET NOCOUNT ON INSERT INTO 圧縮後 SELECT * FROM 圧縮前 |
レコード数は同一なのですが、データサイズに差が出ていることが確認できますね。
固定長のレコードを行圧縮した場合は行データの後ろのスペースが圧縮されるため行サイズが減少します。
可変長データの場合はデフォルトで後ろのスペースは削除された状態でデータが登録されますが、Unicode データの場合はさらに特殊な圧縮が行われます。
■DBCC ページでみる Unicode 圧縮 (行圧縮)
Unicode 圧縮前後を DBCC PAGE で確認をしてみたいと思います。
行圧縮前の Unicode の nvarchar データは以下のように格納されています。
Unicode 文字列の場合 2 バイトで一文字が格納されますので半角の場合も 1 バイトでなく 2 バイト使用されます。
同じデータを格納したものを表示しているのですが、Record size に差が出ています。
実際に格納されたデータを確認すると、Unicode 圧縮することで半角文字が 1 バイトで格納されているのが確認できますね。
これが、Unicode の可変長の列に対して行圧縮を行ったことによるサイズの減少の効果になります。
Unicode の可変長に対して行圧縮をしても効果があるのが確認できますね。
実際にどのようにデータが格納されているか確認するときには DBCC PAGE を使うと便利です♪