10

对于“大”表,是否有任何理由不对可选列的索引进行过滤?

所以对于列 AAA 的索引(因为人们可以在 AAA 上搜索),
我可以将过滤器设置为([AAA] IS NOT NULL).
这样可以节省存储空间,因此可以节省资金。

technet的更多优势:

  • 提高查询性能和计划质量
  • 降低索引维护成本
  • 降低索引存储成本

人们说最好对大部分为空的列的索引进行过滤。但是为什么我不对空列的索引进行过滤,比如 1% 呢?如果它只有优点,有什么理由不做吗?

4

2 回答 2

5

这通常是一个好主意,有两个陷阱:

  1. 表设计器有一个错误(仅在 Denali 之前!)。当它重建一个表时,它会删除所有过滤器。
  2. 确保优化器可以静态地告知您的谓词永远不会允许返回空行。通常,这是因为 SQL NULL 语义(似乎是它们帮助而不是阻碍的唯一情况)。示例:select distinct col from T不会使用索引,因为可能会找到空值。使用这个:select distinct col from T where col is not null

过滤后的索引没有得到充分利用。它们甚至可以用来使可为空的列唯一。

我的实用建议:尝试几个月,如果有其他不可预见的问题,请自行学习。

如果您喜欢高级 SQL Server 查询技术,还可以查看广告索引视图。它们是一组超级过滤索引(至少在 Enterprise 上)。

于 2012-05-11T10:00:03.303 回答
0

所有指标都有优点和缺点: 缺点:

  1. 他们占用磁盘空间
  2. 它们需要维护(索引树的平衡需要定期重组,以确保任何查询优化不使用 bum 数据分布),这可能意味着它们需要下线——如果它们很忙,那就是坏消息
  3. 如果频繁插入,他们需要时间即时更新

好处:

  1. 设计得当,它们可以消除昂贵的表扫描
  2. 设计得当,(覆盖索引)它们可以消除任何表读取。

所以像往常一样,这取决于。

  1. 索引过多会显着降低写入性能
  2. 索引过多会显着增加空间使用量
  3. 不正确的索引会显着降低读取性能

有些人因为真正了解他们关于索引的知识而过上了很好的生活:这里有非常好的东西http://www.insidesqlserver.com/

因此,这取决于用户返回索引引用的数据的频率与他们更新通过索引包含的数据的频率。

稀疏列的索引没有什么不同,但是在列(大部分)为空的情况下,过滤索引更有效。一旦备用性降低(例如 50/50),那么当优化器决定返回数据的最佳计划时,数据的分布就会变得非常重要。过滤后的索引不会知道过滤器之外的数据分布 - 有点明显,但需要说明。

于 2012-05-11T09:49:15.077 回答