スパースカラム、フィルタインデックス、カラムセットは、SQL Server 2008の新機能である。これらにより、1024カラムの制限を超えてカラムを定義できる上に、ディスクスペースを大幅に節減できるが、適切に使用しなければ、トラブルの原因となる。
名前が示すとおり、スパースカラムは、通常Nullとなるカラムで使用することを目的として設計されている。スパースカラムによるスペースの節減は画期的であり、カラムが特定の制約に従うときに増大するだけである。
スパースカラムの第一規則は、実際にスパースでなければならないことである。Null である場合、データポイントはカラムが存在しないかのようにスペースを消費しない。しかし、何らかの値を入力すると、通常より4バイト以上増加する。この法則は、1ビットのカラムにも適用され、0.125から4.125バイトまで増加する。これにより、ビットカラムの臨界点は98%までNullになる。ビットより大きいフィールドでは、増加はより早く見られる。たとえば、datetime型カラムの臨界点は行の52%に過ぎない。これらの例で確認できる臨界点のスペースの節減は、少なくとも40%になる。SQL Server Books Onlineには、各データ型を示すスパースカラムのチャート(リンク)と、カラムをスパースに設定する必要があるケースが紹介されている。
第二規則は、スパースカラムを念頭に置いてインデックスを作成する必要があることである。標準的なインデックスを使用することはできるが、Nullはクエリの発行対象とならないことが多いので、多大なスペースを無駄に消費することになる。これに対するソリューションがフィルタインデックスと呼ばれるSQL Serverのもう1つの新機能である。フィルタインデックスには、特定の基準に満たない行を指示しないようにするwhere句がある。スパースカラムの場合、その基準は通常、where "column_name IS NOT NULL"である。
また、スパースカラムは通常のカラムに比べて遅くなるので、I/Oではなく、CPUが境界制約となるパフォーマンスセンシティブなクエリでは、避けた方がよい。
スパースカラムを使用するかわりに、通常のカラムにフィルタインデックスを適用できる。その場合、スパースカラムの制限を受けずに、インデックスを大幅に縮小することができる。前述のとおり、カラムがNullかどうかだけではなく、それ以外の条件でフィルタすることができる。
1024カラムの制限を超えてカラムを定義したい場合は、カラムセット(リンク)に着目する必要がある。カラムセットを使用すると、クエリを目的として、1つのXMLカラムにすべての超過分のカラムをまとめることができる。1つのクエリから1024カラム以上が返されないかぎり、個別のカラムに通常どおりアクセスすることができる。
Qingsong Yao氏によると(リンク)、Microsoftは、クライアントのために1024カラムの制限を保持する必要があった。
1024カラム以上作成するためには、テーブルにカラムセットカラムを定義する必要があります。Microsoftでは、クライアントが1024カラム以上取得できないためにデータを取得できないという問題を解決する目的で、要求を明示しています。テーブルにカラムセットを定義すると、その選択*により、すべてのスパースカラムが非表示になり、カラムセットだけが表示されます。その一方、クライアントはクエリで個別のスパースカラムを選択することができます。
カラムセットは、テーブルの本来の設計の一部である必要がある。テーブルにスパースカラムが含まれている場合、カラムセットを追加することはできない。一度作成すると、新たに追加されたスパースカラムがカラムセットに自動的に追加される。
カラムセットはXMLとして表示されるので、基本となるカラムにマッピングできないような方法でXMLを変更することがないように注意する必要がある。