使用deleteAt dateTime列进行软删除的过滤索引或索引视图?

时间:2015-03-14 01:12:25

标签: sql-server web-applications soft-delete indexed-view filtered-index

我们使用deleteAt列来指定某些内容是活动的还是(软)删除的。哪种技术最适合查询活动内容?

实际表格上的过滤索引会更好,还是带有deleteAt is NULL的索引视图?

这是索引视图的一个很好的用例吗?

或者我们应该使用过滤索引进行常规视图吗?

1 个答案:

答案 0 :(得分:1)

我没有使用一个Datetime列来处理软删除,而是使用两列。

ColumnName    Data Type
 Deleted        BIT      DEFAULT(0) 
 DeletedAt    DateTime     

在已删除列上创建过滤索引WHERE Deleted = 0

原因是,带有软删除行的数据我们大多只返回活动/非删除行。因此,每次返回行时,sql server都可以查看最小数据类型(位为1字节)的过滤索引,并进行较少的数据处理。

如果您想知道记录何时被删除,DaletedAt列就可以存储该信息。

另一方面如果您只有一个日期时间列来处理软删除,那么您的过滤索引将类似于WHERE DeletedAT IS NULL,现在在这种情况下,SQL Server将查询8字节的数据,以检查是否一行是否有效。在这种情况下,与BIT列相比,您执行的数据处理次数是获得相同结果的8倍。听起来很糟糕不是:)

因此,我的推荐将是添加另一个位列,并在该位列上的过滤索引来处理软删除。保留DeletedAt列以仅处理删除。