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

filtered index or indexed view for Soft-delete with deleteAt dateTime column?

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

实际 table 上的筛选索引更好,还是 deleteAt is NULL 的索引视图更好?

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

还是我们应该使用过滤索引进行常规查看?

我不使用一个日期时间列来处理软删除,而是使用两个列。

ColumnName    Data Type
 Deleted        BIT      DEFAULT(0) 
 DeletedAt    DateTime     

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

原因是,具有软删除行的数据我们大多只有 return Active/Non-Deleted 行。因此,每次您 return 行 sql 服务器都可以查看最小数据类型(位为 1 字节)的过滤索引,并进行较少的数据处理。

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

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

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