【问题标题】:How to improve performance when deleting entities from database?从数据库中删除实体时如何提高性能?
【发布时间】:2010-09-10 13:57:01
【问题描述】:

我使用 SQL Server 2008 为我的 DAL 启动了一个带有 Entity Framework 4 的 ASP.NET 项目。在我的数据库中,我有一个表 Users 应该有很多行(例如 5.000.000)。

最初我的用户表是这样设计的:

Id  uniqueidentifier    
Name    nvarchar(128)   
Password    nvarchar(128)
Email   nvarchar(128)
Role_Id int 
Status_Id   int

我已经修改了我的表格,并添加了一个MarkedForDeletion 列:

Id  uniqueidentifier    
Name    nvarchar(128)   
Password    nvarchar(128)
Email   nvarchar(128)
Role_Id int 
Status_Id   int 
MarkedForDeletion   bit

我应该每次都删除每个实体,还是使用MarkedForDeletion 属性。这意味着我需要更新该值,并在某个时刻使用存储过程或类似的东西删除所有将值设置为 true 的用户。

MarkedForDeletion 属性的更新成本不与删除操作相同吗?

【问题讨论】:

  • 如果您需要历史记录,请将 MarkForDeletion 更改为日期。我开发的许多系统都必须跟踪信息多年,即使被“删除”。
  • @Dave:+1。在这方面,可为空的 smalldatetime 非常适合我。对于内部系统,甚至是deletedByUserName。哎呀,甚至完全转移到审计表。 :)
  • @Dave:在这种情况下,如果我理解正确,MarkForDeletion 将表示该项目被“删除”的日期。但是对分贝有什么影响呢?意思是更新比删除快?在我看来它仍然是一个数据库访问操作。
  • @SorinA:并非所有的“访问操作”都是平等的!
  • @SorinA:测量性能。除非您拥有大容量系统,否则更新和删除的费用可能是相等的。现代数据库能够在低使用率期间对表进行物理碎片整理。因此,删除的性能损失是在以后支付的,如果有的话。加上缓存和大量 RAM,您不必担心。

标签: sql-server database


【解决方案1】:

根据系统的要求/需要/未来需要,考虑将“已删除”的实体移至新表。设置一个“审计”表来保存那些被删除的。考虑一下有人想要“恢复”某些东西的情况。

关于性能的问题:更新与删除的成本是否相同?不会。更新操作会轻松得多,尤其是如果您在 PK 上有一个索引(错误,这是一个 guid,而不是一个 int)。关键是对位字段的更新要便宜得多。 (大量)删除将强制重新洗牌数据。也许该作业属于停机时间或低容量时期。

关于性能:对其进行基准测试,看看会发生什么!鉴于您的表有 500 万行,很高兴看到您的 SQL Server 在其当前状态下的索引、分页等两种情况下的执行情况。备份您的数据库,然后恢复到新数据库。在这里,您可以随心所欲地进行沙箱。运行和计时场景:

  • 批量删除对比
  • 更新 bitsmalldatetime 字段与
  • 移至审核表

在书籍方面,尝试:

【讨论】:

    【解决方案2】:

    这可能取决于您要如何处理这些信息。例如,您可能希望将用户标记为删除,但不删除他的所有子记录(例如论坛帖子),在这种情况下,您应该标记删除或使用删除的日期字段。如果您这样做,请创建一个供所有活动用户使用的视图(称为 ActiveUsers),然后坚持在任何登录查询或您只想查看活动用户的地方使用该视图。这将有助于防止当您忘记排除不活动的查询错误时出现查询错误。如果您的系统处于活动状态,请勿在未完成并调整所有需要使用新视图的查询之前进行此更改。

    使用第二个版本的另一个原因是在删除大量子记录时防止减速。如果您使用已删除标志,则不再需要删除它们。这有助于提高性能,因为需要的资源更少。此外,您可以标记删除记录,然后在半夜删除它们(或移动到历史表)以保持主表更小,但在高峰时段仍不影响性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2015-09-11
      • 2011-01-01
      • 1970-01-01
      • 2016-09-20
      相关资源
      最近更新 更多