SQL Server 2008 のわかりやすい特徴の一つが、圧縮機能。
- バックアップ圧縮 (CTP 5, Released)
- データ圧縮 (CTP 6)
今回の Nov CTP 5 では、バックアップの圧縮機能が提供されました。
バックアップの圧縮機能は、これまでも市販のツールで提供されていたので、わかりやすいですね。
データ圧縮は, 次回 CTP 6 待ち
そうなんです、データ圧縮機能は、次回に持ち越しです。
CTP 6 がいつになるかわかりませんので、マイクロソフトの方々のブログから拾ってみました。
【データ圧縮 (予定 ?) 】
- ROW / 行単位の圧縮
- PAGE / ページ単位の圧縮
まず、この圧縮は、ZIP, LZH などの圧縮とは異なります。
できるかぎり、無駄なスペース、重複を省こうというコンセプトのようです。
では、データ圧縮をみます。
圧縮の種類は、2種類です。
ROW/ 行単位での圧縮では、行内の無駄なスペースを削減します。
わかりやすい例として、char(8000) の列に 'a' と入っている場合を考えます。
char は、固定長のデータ型ですので、8000 バイトのスペースを消費します。
つまり、8000 - 1 = 7999 バイトは無駄にスペースが入っています。
ROW 圧縮では、この 7999 バイトの部分を埋めてしまいます。
まるで、char なのに、varchar のように扱うわけですね。
同様に int データ型の列に 10 と入っている場合は、4バイトのうち無駄なバイトを削減するようです。
SQL Server 2005 SP2 で提供された VarDecimal の考えの拡張ですね。
次に PAGE / ページ単位の圧縮です。
ページの場合は、データ内に同じ値が繰り返し出現する場合に、値を一回だけ保存します。
たとえば、'Osaka' という値が、10000 行に入っているとします。
この場合、'Osaka' という値をひとつだけ、保存し、レコードの値としては、値へのポインタに変換します。
大福帳タイプのテーブルや、スタースキーマのデータウェアハウスなどでは、大幅なデータの圧縮ができそう。
ご興味のある方は、Sunil さん、EUAN さん、ブログをご参照ください。
【ブログ】
ちなみに、このデータ圧縮。実際にどんな動きをするのか、いろいろ検証したいですね。
【検証したいポイント】
- update table1 set a = 'Tokyo' というように 'Osaka' から 'Tokyo' へすべての列の値を変更したら、変更は一か所だけでいいはずですが、どうなるんだろうか。
- update table1 set a = 100000 というように、値が 1 の列をすべて 10000 に変更したら、ページスプリットの山 ?
- リプリケーションや、ミラーリングでのトラフィックも削減される ?
- バックアップしたデータやログも小さい ?
- リストアは速くなる ?
- メモリ上のキャッシュはどうなる ?
- CPU 負荷はどこまで高い ?
- tempdb のパフォーマンス改善になる ?
【データベースを圧縮する意味】
また、ブログでは、圧縮する意味はあるのか ? について検討もしていました。
1TB の ハードディスクが、4万円ぐらいで購入できるのにと。
もちろん、効果はありますよね。
SAS のドライブは、ぜんぜん高価ですし、SAN にすると、とっても高い。
iSCSI のドライブを利用するのであれば、少しでも、ネットワーク負荷を下げたい。
さてさて、Nov CTP 5 はリリースされたので、CTP 6 がもっと楽しみに。