sql表中有两个大部分为空的列会对性能造成影响
我有一个成员表,大约有20-30列。我们最近添加了以下内容以允许永久关闭帐户sql表中有两个大部分为空的列会对性能造成影响,sql,sql-server,entity-framework,sql-server-2008,Sql,Sql Server,Entity Framework,Sql Server 2008,我有一个成员表,大约有20-30列。我们最近添加了以下内容以允许永久关闭帐户 bool IsClosed datetime DateClosed - nullable varchar[100] PreviousEmail - nullable 大概每10000名会员中就有1人会要求关闭账户。目前,这只能通过请求来完成 我认为我们应该把DateClosed和PreviousEmail放在一个单独的表中,对数据进行非规范化处理。然而,我可以告诉团队中的其他成员不这么认为,这只是额外的工作和引入另一
bool IsClosed
datetime DateClosed - nullable
varchar[100] PreviousEmail - nullable
大概每10000名会员中就有1人会要求关闭账户。目前,这只能通过请求来完成
我认为我们应该把DateClosed和PreviousEmail放在一个单独的表中,对数据进行非规范化处理。然而,我可以告诉团队中的其他成员不这么认为,这只是额外的工作和引入另一个连接的更复杂的查询
我现在倾向于创建新表,但我意识到我是一个完美主义者。假设您没有其他布尔变量,这将使非关闭成员记录的大小增加约9个字节(1个字节用于
isclosed
,8个字节用于dateclosed
,而以前的电子邮件则没有)。额外的列也可能导致扩展空位数组
如注释中所述,您不需要IsClosed
,因为您大概可以查看DateClosed
。可能有理由使用布尔值。例如,帐户可能会重新打开,或者记录中可能存储了将来的关闭日期
添加这些列将对数据库产生影响。我可以想象几分钟,因为所有的数据都需要重写——一个页面上容纳的记录更少,因此添加列可能会导致页面拆分。这是一次性操作。如果您测试它,然后将它安排在周日凌晨3:00(假设这是一个安静的时间),那么对系统的影响可能最小
我同意,如果你确信这是一条正确的道路,那么应该直接在表格中进行修改。拥有一个单独的表,并对查询进行修改,这似乎是一条通向毛茸茸的、不可读的、难以维护的代码的道路。一个小小的婴儿噩梦,只是渴望自由呼吸
另一方面,您可能会考虑单独的状态表。这将有一个成员id,以及成员身份的生效日期和结束日期。这可能会成为会员国,也可能是会员国之外的其他州——暂停、审判或其他任何州
然后,您的查询将需要合并这些信息,您可以使用各种机制(如视图和表值函数)进行合并。小改动,但不需要IsClosed和DateClosed。如果DateClosed为NULL,则表示帐户未关闭。除非您加入这些字段,否则不会影响您的查询。如果您正在执行select*
操作,将会选择更多的数据,这会减慢速度,但我无法想象您的运行离生产线如此之近,会对您产生真正的影响。更多是一种偏好。您可能希望查看稀疏列,因为您认为5M中可能有10k个值。