SQL筛选索引:我是否应该始终在可选列的索引上放置筛选器?
对于“大型”表,是否有任何理由不在可选列的索引上放置筛选器 因此,对于列AAA上的索引(因为人们可以在AAA上搜索),SQL筛选索引:我是否应该始终在可选列的索引上放置筛选器?,sql,sql-server-2008,indexing,filtered-index,Sql,Sql Server 2008,Indexing,Filtered Index,对于“大型”表,是否有任何理由不在可选列的索引上放置筛选器 因此,对于列AAA上的索引(因为人们可以在AAA上搜索),我可以将过滤器设置为([AAA]不为空)这节省了存储空间,因此节省了资金 更多优势来自: 改进了查询性能和计划质量 降低索引维护成本 降低索引存储成本 人们说,最好在索引中为大部分为空的列设置一个过滤器。但是为什么我不在索引上为空的列设置一个过滤器,比如1%的列?如果只有优点,有什么理由不这样做吗?所有指标都有优点和缺点: 缺点: 它们会占用磁盘空间 它们需要保持(平衡的)
我可以将过滤器设置为
([AAA]不为空)
这节省了存储空间,因此节省了资金 更多优势来自:
- 改进了查询性能和计划质量
- 降低索引维护成本
- 降低索引存储成本
人们说,最好在索引中为大部分为空的列设置一个过滤器。但是为什么我不在索引上为空的列设置一个过滤器,比如1%的列?如果只有优点,有什么理由不这样做吗?所有指标都有优点和缺点: 缺点:
稀疏列的索引没有什么不同,但是,如果列(大部分)为空,则过滤索引的效率更高。一旦稀疏性降低(例如50/50),那么当优化人员决定返回数据的最佳计划时,数据的分布就变得非常重要。过滤后的索引不会知道过滤器外数据的分布,这有点明显,但需要说明 这通常是一个好主意,有两个问题:
select distinct col from T T
将不使用索引,因为可能会找到空值。使用此选项:选择与T不同的列,其中列不为null
如果您对高级SQL Server查询技术感兴趣,还可以查看广告索引视图。它们是一组经过筛选的索引(至少在企业版上是如此)。我认为您没有抓住问题的关键。它不是关于一般的索引,而是关于索引的过滤器。它消除了您占用磁盘空间等的缺点。对不起,我想指出的是,在考虑建立索引时,总体考虑从同一位置开始。数据密度、读写等。结果应为索引/无索引,如果为索引,则为索引类型。随着时间的推移和数据分布的变化,您还可以使用缺失/未使用的索引存储过程来调整性能。过滤索引比无索引占用更多空间,比未过滤索引占用更少空间。不想发动战争!现在我的问题是:你说“如果列很大程度上是空的,那么过滤后的索引更有效”-->为什么我不为一个只有5%甚至1%为空的列的索引设置一个过滤器呢?(它仍然可能是500000行,所以它确实节省了存储。)@ErikDekker——我认为答案的最后一段包含了一个原因。与索引一起创建的统计信息使用相同的过滤器,因此可能会丢失表的一些密度信息,这意味着优化器在某些情况下可能会做出非最佳决策。然而,我想您可以使用CREATESTATISTICS语句来充分利用这两个方面。。。