使用 MS SQL 2008,所有表都包含一个 Status varchar(1) 列,该列指示“I”表示插入记录,“U”表示更新记录,“D”表示已删除记录以及 DateCreated 日期时间列和 DateUpdated 日期时间列.
在大多数情况下,我们只想查询表中的活动记录,我们会执行以下操作:
SELECT column FROM table WHERE Status <> 'D'
为了提供对使用的看法,这是最常用的过滤器,因为它几乎出现在每个查询中,并且在连接表时出现多次。
我们正在开发一个新的 Web 应用程序和数据库,重点是最大限度地提高性能。一个建议是,从这个和未来的项目开始,将 varchar(1) 状态列模式替换为类似于“IsDeleted”的方式,以指示记录是否被删除,并从两个日期时间字段推断更新状态。
换句话说...
SELECT column as InsertedRecords FROM table WHERE Status = 'I' -- Rare case
SELECT column as UpdatedRecords FROM table WHERE Status = 'U' -- Rare case
SELECT column as ActiveRecords FROM table WHERE Status <> 'D'
SELECT column as DeletedRecords FROM table WHERE Status = 'D'
......反而看起来像......
SELECT column as InsertedRecords FROM table WHERE IsDeleted = 0 AND DateCreated = DateUpdated -- Rare case
SELECT column as UpdatedRecords FROM table WHERE IsDeleted = 0 AND DateCreated <> DateUpdated -- Rare case
SELECT column as ActiveRecords FROM table WHERE IsDeleted = 0
SELECT column as DeletedRecords FROM table WHERE IsDeleted = 1
是否有任何切实的性能优势/影响(主要围绕索引和大型查询)或者两种实现都完全可以接受?为了一致性而继续当前模式以使它们与先前创建的应用程序/数据库保持一致是否有任何缺点?