我们使用deleteAt
列来指定某些内容是活动的还是(软)删除的。哪种技术最适合查询活动内容?
实际表格上的过滤索引会更好,还是带有deleteAt is NULL
的索引视图?
这是索引视图的一个很好的用例吗?
或者我们应该使用过滤索引进行常规视图吗?
答案 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列以仅处理删除。