sql表中有两个大部分为空的列会对性能造成影响

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放在一个单独的表中,对数据进行非规范化处理。然而,我可以告诉团队中的其他成员不这么认为,这只是额外的工作和引入另一

我有一个成员表,大约有20-30列。我们最近添加了以下内容以允许永久关闭帐户

bool IsClosed
datetime DateClosed - nullable
varchar[100] PreviousEmail - nullable
大概每10000名会员中就有1人会要求关闭账户。目前,这只能通过请求来完成

我认为我们应该把DateClosed和PreviousEmail放在一个单独的表中,对数据进行非规范化处理。然而,我可以告诉团队中的其他成员不这么认为,这只是额外的工作和引入另一个连接的更复杂的查询

  • 这是一个过早的优化吗
  • 如果我们的会员人数最多只有500万,那会有什么样的表现
  • 当问题出现时,我是否应该做出改变,并在此期间继续努力

  • 我现在倾向于创建新表,但我意识到我是一个完美主义者。

    假设您没有其他布尔变量,这将使非关闭成员记录的大小增加约9个字节(1个字节用于
    isclosed
    ,8个字节用于
    dateclosed
    ,而
    以前的电子邮件则没有)。额外的列也可能导致扩展空位数组

    如注释中所述,您不需要
    IsClosed
    ,因为您大概可以查看
    DateClosed
    。可能有理由使用布尔值。例如,帐户可能会重新打开,或者记录中可能存储了将来的关闭日期

    添加这些列将对数据库产生影响。我可以想象几分钟,因为所有的数据都需要重写——一个页面上容纳的记录更少,因此添加列可能会导致页面拆分。这是一次性操作。如果您测试它,然后将它安排在周日凌晨3:00(假设这是一个安静的时间),那么对系统的影响可能最小

    我同意,如果你确信这是一条正确的道路,那么应该直接在表格中进行修改。拥有一个单独的表,并对查询进行修改,这似乎是一条通向毛茸茸的、不可读的、难以维护的代码的道路。一个小小的婴儿噩梦,只是渴望自由呼吸

    另一方面,您可能会考虑单独的状态表。这将有一个成员id,以及成员身份的生效日期和结束日期。这可能会成为会员国,也可能是会员国之外的其他州——暂停、审判或其他任何州


    然后,您的查询将需要合并这些信息,您可以使用各种机制(如视图和表值函数)进行合并。

    小改动,但不需要IsClosed和DateClosed。如果DateClosed为NULL,则表示帐户未关闭。除非您加入这些字段,否则不会影响您的查询。如果您正在执行
    select*
    操作,将会选择更多的数据,这会减慢速度,但我无法想象您的运行离生产线如此之近,会对您产生真正的影响。更多是一种偏好。您可能希望查看稀疏列,因为您认为5M中可能有10k个值。