我使用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
属性的更新与删除操作的成本是否相同?
答案 0 :(得分:2)
这可能取决于您对信息的处理方式。例如,您可能希望将用户标记为删除但不删除所有子记录(例如论坛帖子),在这种情况下,您应标记为删除或使用删除日期字段。如果这样做,请创建一个用于所有活动用户(称为ActiveUsers)的视图,然后坚持在任何查询中使用该视图进行登录,或者只希望查看活动用户。当您忘记排除不活动的错误时,这将有助于防止查询错误。如果您的系统处于活动状态,请不要进行此更改,也不要调整所有需要使用新视图的查询。
使用第二个版本的另一个原因是在删除大量子记录时防止减速。如果使用已删除的标志,则不再需要删除它们。这可以帮助提高性能,因为需要的资源更少。此外,您可以标记detion的记录,然后在半夜(或移动到历史记录表)中将它们删除,以使主表保持较小但仍然不会影响高峰时段的性能。
答案 1 :(得分:2)
根据系统的要求/需求/未来需求,考虑将“已删除”实体移至新表。设置“审核”表以保存已删除的表。考虑有人想要“恢复”的情况。
关于性能的问题:更新是否与删除成本相同?不会。更新操作会更轻松,特别是如果你有PK的索引(errrr,那是一个guid,而不是int)。关键是对位字段的更新要便宜得多。 (大量)删除将迫使数据重新洗牌。也许这项工作属于停工期或低产期。
关于性能:基准测试看看会发生什么!鉴于您的表有500万行,在两种情况下,看看SQL Server在其当前索引状态,分页等方面的表现会很好。备份数据库,并还原到新数据库。在这里你可以随意沙盒。 Run&时间场景:
bit
或smalldatetime
字段vs。就书籍而言,请尝试: