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

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

问题描述:

我开始了一个ASP.NET项目与实体框架4我DAL,使用SQL Server 2008在我的数据库,我有一个表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属性的更新成本相同的删除操作?

+1

如果您需要历史记录,请将MarkForDeletion更改为日期。我开发的许多系统必须追踪多年的信息,即使“删除”也是如此。 – 2010-09-10 14:00:19

+1

@Dave:+1。在这方面,可空的smalldatetime对我来说非常完美。对于内部系统,甚至是'deletedByUserName'。哎呀,甚至完全转到审计表。 :) – 2010-09-10 14:09:43

+0

@Dave:在这种情况下,如果我理解正确,MarkForDeletion将表示该项目被“删除”的日期。但是对db的影响是什么?意味着更新比删除更快?从我的角度来看,它仍然是一个数据库访问操作。 – 2010-09-10 14:13:36

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

要上表现你的问题:将更新是相同的成本为删除?不。更新将是一个轻量级的操作,特别是如果你有一个关于PK(errrr,这是一个GUID,而不是一个int)的索引。重点是更新位字段的成本要低得多。 (质量)删除将强制重新排列数据。也许这份工作属于停工或低产期。

关于业绩:基准它,看看会发生什么!如果您的表有500万行,那么在两种情况下,看看您的SQL Server如何执行目前的索引,分页等状态将会很好。备份数据库,并恢复到新的数据库中。在这里你可以随心所欲地使用沙箱。运行&时间的情景:

  • 批量删除与
  • 更新一个bitsmalldatetime场主场迎战
  • 移动到审计表

在图书方面,尝试:

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

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