使用 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 列以仅处理删除。
我们使用 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 列以仅处理删除。