* Storing a null in a sparse column takes up no space at all.
* To any external application the column will behave the same
* Sparse columns work really well with filtered indexes as you will only
want to create an index to deal with the non-empty attributes in the column.
* You can create a column set over the sparse columns that returns an xml
clip of all of the non-null data from columns covered by the set. The
column set behaves like a column itself. Note: you can only have one
column set per table.
* Change Data Capture and Transactional replication both work, but not the
column sets feature.
Downsides
* If a sparse column has data in it it will take 4 more bytes than a normal
column e.g. even a bit (0.125 bytes normally) is 4.125 bytes and unique
identifier rises form 16 bytes to 20 bytes.
* Not all data type can be sparse: text, ntext, image, timestamp, user-defined
data type, geometry, or geography or varbinray (max) with the FILESTREAM
attribute cannot be sparse. (Changed17/5/2009 thanks Alex for spotting the
typo)
* computed columns can't be sparse (although sparse columns can take part in a
calculation in another computed column)
* You can't apply rules or have default values.
* Sparse columns cannot form part of a clustered index. If you need to
do that use a computed column based on the sparse column and create the
clustered index on that (which sort of defeats the object).
* Merge replication doesn't work.
* Data compression doesn't work.
* Access (read and write) to sparse columns is more expensive, but I
haven't been able to find any exact figures on this.
Reference