包含列与过滤索引

11 index sql-server filtered-index

我们目前使用名为tb_tranfers 的表。该表有 4000 万行,大小约为 26 GB(11 GB 数据,15 GB 索引)。

10% 到 15% 的行是软删除的行(DeletedDate不为空)。该应用程序仅使用DeletedDate为 null 的行。对该表的所有查询都将包含一个具有该效果的子句。

该表有 15 个索引。缺失的索引 DMV 包含使用DeletedDate作为包含列创建索引的建议。

WHERE DeleteDdate IS NULL在所有 11 个非聚集索引上使用过滤索引会有帮助吗?还是将DeletedDate列作为包含列会更好?

Rem*_*anu 12

是的,将所有 11 个 NC 索引修改为过滤索引 ( CREATE INDEX ... ON ... WHERE DeletedDate IS NULL) 会有所帮助。通过这种方式,您可以获得两个优势:

  • 查询优化器将知道,任何行从这些指标来已经不会满足于DeletedDate查询过滤器,所以它不会来查找聚集索引仔细检查DeletedDate
  • 所有 NC 索引的大小都将缩小 10-15%,需要更少的内存和更少的 IO 操作来查找。

权衡是任何关注软删除行的查询(并且必须有一些查询,否则为什么这些行存在?)将无法使用这些 NC 索引。


JNK*_*JNK 7

如果您总是DeletedDate IS NULL在查询中使用过滤器,那么是的,您可能会通过添加过滤器看到显着的性能提升。

引擎检查以查找相关行的页面要少得多,这意味着更少的 IO(和更快的速度)。

将其添加为INCLUDED字段将毫无用处。由于您始终将其包含在过滤器中(但可能永远不会将其添加到 SELECT 列表中),因此如果您将其添加为INCLUDE.