从数据库中删除实体时如何提高性能?

时间:2010-09-10 13:57:02

标签: sql-server database

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

最初,我的Users表设计如下:

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属性的更新与删除操作的成本是否相同?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

根据系统的要求/需求/未来需求,考虑将“已删除”实体移至新表。设置“审核”表以保存已删除的表。考虑有人想要“恢复”的情况。

关于性能的问题:更新是否与删除成本相同?不会。更新操作会更轻松,特别是如果你有PK的索引(errrr,那是一个guid,而不是int)。关键是对位字段的更新要便宜得多。 (大量)删除将迫使数据重新洗牌。也许这项工作属于停工期或低产期。

关于性能:基准测试看看会发生什么!鉴于您的表有500万行,在两种情况下,看看SQL Server在其当前索引状态,分页等方面的表现会很好。备份数据库,并还原到新数据库。在这里你可以随意沙盒。 Run&时间场景:

  • mass delete vs.
  • 更新bitsmalldatetime字段vs。
  • 转到审核表

就书籍而言,请尝试: