我负责在项目上创建数据库。我们的字段很少会具有值(每10,000条记录中有1个),我正在尝试找出将其存储在数据库中的最佳方法。
据我所知,我有3种选择:
- 在表格中为每个附加值添加一列
- 添加一个链接表,该表引用原始表,并且仅在需要存储值的位置才有记录
- 在原始表中使用XML数据类型,并在其中存储所有值。
还有其他我没有考虑的选择吗?
我正在尝试找出每种方法的利弊。据我所知,1是最简单的,2将占用最少的空间,但是我一直在努力寻找3的许多资源。
我负责在项目上创建数据库。我们的字段很少会具有值(每10,000条记录中有1个),我正在尝试找出将其存储在数据库中的最佳方法。
据我所知,我有3种选择:
还有其他我没有考虑的选择吗?
我正在尝试找出每种方法的利弊。据我所知,1是最简单的,2将占用最少的空间,但是我一直在努力寻找3的许多资源。
Answers:
听起来您需要的是稀疏列和过滤后的索引,并带有选项1。在此情况下,这些功能是完全受支持和记录的功能。
SQL Server数据库引擎在列定义中使用SPARSE关键字来优化该列中值的存储。因此,当表中任何行的列值均为NULL时,该值无需存储。
我无法想象在这种情况下XML解决方案会表现良好,它将有大量的冗余元数据开销,并且查询速度会很慢。
如果SQL Server中的长度可变,则可为空的列将不占用空间。NULL的事实存储在NULL位图中。您可以根据需要使用过滤后的索引为其建立索引,以便忽略NULL列。
考虑第1点时会增加复杂性。
别。难以搜索,解析等:您稍后会后悔
这也取决于大小:几十亿行是否为char(1000)?还是tinyint可以容纳10万行?如果后者考虑了点2所增加的复杂性,则不值得。
使用SQL Server 2008,您可以选择使用稀疏列,这是针对您提到的情况专门设计的。
它们具有额外的好处,您可以使用XML COLUMN_SET将它们视为组合的XML对象,也可以单独引用它们,并且可以节省大量空间。
请查看以下博客文章以了解更多详细信息:http : //www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx