空值列是否会影响Microsoft SQL Server的性能?

5

我有一个包含超过200列的数据表,但在其中一半以上的列中,大多数数据行的值为“NULL”。

这些NULL值是否会降低我的SQL Server的性能,或者具有NULL值的字段是否对数据表上的所有操作都无关紧要?


1
由于存在这么多的NULL值,您可能需要了解稀疏列。请参考此链接:https://learn.microsoft.com/en-us/sql/relational-databases/tables/use-sparse-columns?view=sql-server-2017 - Sean Lange
3
超过200栏目让我更加担心。 - jarlh
这是一个ERP系统的数据表之一,也是其中最大的数据表之一。 - Gill Bates
1
你是否关注于某个特定的性能领域?也许这会有助于改善你所得到的答案。目前你的问题比较广泛,如果你能够缩小范围,你会发现答案的实用性会增加。 - Nick DeVore
2个回答

2
表的性能基本上取决于I/O。SQL Server在数据页上排列行的方式意味着,NULL值可能会占用空间,也可能不会,这取决于底层数据类型。SQL Server数据页包含每个列(甚至是NOT NULL列)的nullability位清单,以保留NULL信息。
可变长度字符串只使用NULL位,因此它们在每行中不占用额外的空间。其他数据类型确实占用空间,即使对于NULL值也是如此(我认为这包括固定长度字符串)。
这对性能有什么影响?如果您有200个NULL整数字段,那么在数据页面上就有800个字节。这限制了存储在给定页面上的记录数量,最多不超过10条记录。因此,如果您想读取100条记录,则查询必须读取(至少)10个数据页面。如果该表没有这些列,则可能只能读取一个数据页。
无论是否对于特定的查询或一组查询而言,这是否重要取决于查询。但是,具有NULL值的列可能会影响性能,特别是查询的I/O方面。

1

除了占用空间,对性能可能产生的微小影响外,它们没有任何其他影响。


那么这些 NULL 值会如何影响 SQL Server 呢? - Gill Bates
它们占用空间。我已经说过了,所以显然我没有理解你的问题。 - Tab Alleman
正如第一条评论中的Sean所说,你可以使用SPARSE列来帮助你。此外,你移除null值的最终目标是什么?你正在构建报告吗?ETL所有或特定的非空列?缩小你的请求范围,你将得到更清晰/精确的答案。 - junketsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接