SQL筛选索引:我是否应该始终在可选列的索引上放置筛选器?

SQL筛选索引:我是否应该始终在可选列的索引上放置筛选器?,sql,sql-server-2008,indexing,filtered-index,Sql,Sql Server 2008,Indexing,Filtered Index,对于“大型”表,是否有任何理由不在可选列的索引上放置筛选器 因此,对于列AAA上的索引(因为人们可以在AAA上搜索),我可以将过滤器设置为([AAA]不为空)这节省了存储空间,因此节省了资金 更多优势来自: 改进了查询性能和计划质量 降低索引维护成本 降低索引存储成本 人们说,最好在索引中为大部分为空的列设置一个过滤器。但是为什么我不在索引上为空的列设置一个过滤器,比如1%的列?如果只有优点,有什么理由不这样做吗?所有指标都有优点和缺点: 缺点: 它们会占用磁盘空间 它们需要保持(平衡的)

对于“大型”表,是否有任何理由不在可选列的索引上放置筛选器

因此,对于列AAA上的索引(因为人们可以在AAA上搜索),
我可以将过滤器设置为
([AAA]不为空)

这节省了存储空间,因此节省了资金

更多优势来自:

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

人们说,最好在索引中为大部分为空的列设置一个过滤器。但是为什么我不在索引上为空的列设置一个过滤器,比如1%的列?如果只有优点,有什么理由不这样做吗?

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

  • 它们会占用磁盘空间
  • 它们需要保持(平衡的) 索引树需要定期重新组织,以确保 查询优化未使用bum(数据分布),这可能导致 意味着他们需要离线——如果他们忙的话,这是个坏消息
  • 如果频繁插入,他们需要时间动态更新
  • 优点:

  • 如果设计得当,它们可以消除昂贵的表格扫描
  • 如果设计得当,(一个覆盖索引),它们可以删除任何表格读取
  • 通常情况下,这要视情况而定

  • 索引过多会显著降低写入性能
  • 索引过多会显著增加dispace的使用率
  • 索引不正确会显著降低读取性能
  • 有些人通过真正了解自己关于索引的知识而过上了很好的生活: 这里有非常好的东西

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


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

    这通常是一个好主意,有两个问题:

  • 表设计器有一个bug(仅在Denali之前!)。当它重建一个表时,会删除所有过滤器
  • 确保优化器可以静态地告诉您的谓词永远不允许返回空行。通常情况下,这种情况是因为SQL空语义(这似乎是它们帮助而不是阻碍的唯一情况)。示例:
    select distinct col from T T
    将不使用索引,因为可能会找到空值。使用此选项:
    选择与T不同的列,其中列不为null
  • 过滤后的索引使用率极低。它们甚至可以用于使可空列唯一

    我的实用建议是:只要尝试几个月,如果还有其他不可预见的问题,就自己学习


    如果您对高级SQL Server查询技术感兴趣,还可以查看广告索引视图。它们是一组经过筛选的索引(至少在企业版上是如此)。

    我认为您没有抓住问题的关键。它不是关于一般的索引,而是关于索引的过滤器。它消除了您占用磁盘空间等的缺点。对不起,我想指出的是,在考虑建立索引时,总体考虑从同一位置开始。数据密度、读写等。结果应为索引/无索引,如果为索引,则为索引类型。随着时间的推移和数据分布的变化,您还可以使用缺失/未使用的索引存储过程来调整性能。过滤索引比无索引占用更多空间,比未过滤索引占用更少空间。不想发动战争!现在我的问题是:你说“如果列很大程度上是空的,那么过滤后的索引更有效”-->为什么我不为一个只有5%甚至1%为空的列的索引设置一个过滤器呢?(它仍然可能是500000行,所以它确实节省了存储。)@ErikDekker——我认为答案的最后一段包含了一个原因。与索引一起创建的统计信息使用相同的过滤器,因此可能会丢失表的一些密度信息,这意味着优化器在某些情况下可能会做出非最佳决策。然而,我想您可以使用CREATESTATISTICS语句来充分利用这两个方面。。。