sqlserver 的筛选索引(filter index)与常规的非筛选索引,加了一定的filter条件,可以按照某些条件对表中的字段进行索引,但是filter 索引在查询 使用上,并不等同于常规的索引,
如果忽略了这些差异,可能会造成潜在的问题,因此在使用filter索引的时候,一定要结合具体的查询,做充分的测试。

测试case

if object_id('test_filter_index') is not null
drop table test_filter_index
GO create table test_filter_index
(
id int identity(1,1) not null primary key,
col2 varchar(10),
col3 varchar(10),
create_date datetime
)
GO --写入10W行测试数据,col2 col3非空
insert into test_filter_index
select concat('A',cast(rand()*1000000 as int)),concat('B',cast(rand()*1000000 as int)),getdate()
GO 100000 --写入1W行测试数据,col2 col3为空
insert into test_filter_index
select null,null,getdate()
GO 10000

非filter索引

如果是正常的索引,也即不加filter条件,如下创建测试表上的索引

--col2和col3上,如果是常规索引(非筛选索引)
create index idx_col2 on test_filter_index(col2,col3)
GO

如下,只要是按照索引的前导列进行查询或join,都可以使用到索引

filter索引

如果在创建索引的时候增加filter条件

--删除之前创建的索引
drop index idx_col2 on test_filter_index --col2和col3上,如果是筛选索引(增加col2和col3上的筛选条件)
create index idx_col2 on test_filter_index(col2,col3)
where col2 is not null and col3 is not null
GO

在执行上述的两个查询,会发现,尽管使用的查询条件为索引的前导列,但是扔无法使用到上面创建的filter索引

其实不难理解,为什么上面两种情况无法使用到创建的filter索引?由于在创建索引的时候,增加筛选条件,这个索引树种的数据,可能是不完全符合查询语义的
就比如select * from test_filter_index where col2 = 'A632395',除了 col2 = 'A632395'这个条件之外,对于col3字段,潜在两种符合条件的数据
第一种:select * from test_filter_index where col2 = 'A632395' and col3 is null
第二种:select * from test_filter_index where col2 = 'A632395' and col3 is not null
如果走了filter索引,也即idx_col2 ,查询出来的结果可能就是不完整的,因此不会使用到idx_col2 这个索引
事实上,执行计划很清楚地显示了,什么情况下才可以用到filter索引,只有查询条件的数据被filter索引的筛选条件覆盖,或者说查询条件是filter条件的子集,才有可能用到filter索引

查询是否可以使用到filter索引,只有满足当前的查询结果集,一定是属于索引的filter筛选之后的子集的情况下,才能使用到filter索引,否则都无法使用到filter索引
filter索引只能针对具体的语句进行创建,而不能作为通用的索引使用,这个比较简单,记录一下,防止犯错。

sqlserver 筛选索引(filter index)在使用时需要注意的事项的更多相关文章

  1. SQLSERVER的 筛选索引(Fiter Index)

    fiter index(筛选索引)是SQL Server的一项功能,可使此数据库与众不同. 筛选索引的概念 SQL Server中常用的索引是一种物理结构,它包含来自所有行的一组选定列的值 在一张桌子 ...

  2. sqlserver聚合索引(clustered index) / 非聚合索引(nonclustered index)的理解

    1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索 ...

  3. Context3D的setProgramConstantsFromMatrix使用时需注意的事项

    setProgramConstantsFromMatrix() public function setProgramConstantsFromMatrix(programType:String, fi ...

  4. Gitlab使用时的一些注意事项

    1 gitlab-runner 不选中,在commit没有tab的时候,runner不会进行运行 2 在新安装的gitlab的环境上更改@localhost为远程地址 2.1  vim /opt/gi ...

  5. 转:Hive性能优化之ORC索引–Row Group Index vs Bloom Filter Index

    之前的文章<更高的压缩比,更好的性能–使用ORC文件格式优化Hive>中介绍了Hive的ORC文件格式,它不但有着很高的压缩比,节省存储和计算资源之外,还通过一个内置的轻量级索引,提升查询 ...

  6. SQLServer性能调优3之索引(Index)的维护

    前言 前一篇的文章介绍了通过建立索引来提高数据库的查询性能,这其实只是个开始.后续如果缺少适当的维护,你先前建立的索引甚至会成为拖累,成为数据库性能的下降的帮凶. 查找碎片 消除碎片可能是索引维护最常 ...

  7. 本地计算机上的SQLServer(MSSQLSERVER)服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

    SQLServer的服务启动问题: 本地计算机上的SQLServer(MSSQLSERVER)服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止 出现这个问题导致无法启动SQLServer服 ...

  8. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  9. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

随机推荐

  1. 编码规范(c#)

    万丈高楼平地起,好的编码风格能让别人撸起来更带劲,反之则想吐槽这是哪个傻X写的,这都是些什么乱七八糟的玩意? 然后看后面的注释发现是自己以前写的,那场面一度很尴尬.... 规约不是规则,不是一定要这样 ...

  2. 数据库MySQL的安装与卸载

    安装 MySQL  卸载 MySQL: 停止 MySQL 服务 开始-->所有应用-->Windows 管理工具-->服务,将 MySQL 服务停止. 卸载 mysql server ...

  3. HTML_body中常用的标签部分

    meta: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  4. Asp.net MVC + AngularJS 统一权限管理系统(一)

    背景: 之前公司内部做了不少系统,但是权限管理都是分开的:一直都想能够有一套统一管理的权限管理系统:有的时间都是一直在计划,随着时间的流逝,计划始终没有实现,也随着项目的增多而这权限管理也变得版本多样 ...

  5. [TimLinux] 命令 procps-ng 包内命令介绍

    1. procps-ng包 System and process monitoring utilities. 2. 文件列表 free, pgrep, pkill, pmap, ps, pwdx, s ...

  6. 【解决】OCI runtime exec failed......executable file not found in $PATH": unknown

    [问题]使用docker exec + sh进入容器时报错 [root@localhost home]# docker exec -it container-test bash OCI runtime ...

  7. linux mysql,tomcat与java的安装

    先将服务器的安全组设置为 把所有端口或者所需要的端口开放 然后测试远程访问 ssh 用户@ip                       登录 输入密码 service iptables stop  ...

  8. Mac ifconfig 详解(ifconfig detail)-- 外婆送来的丁香(Grandma's clove)

    引言 Intro 图片源链:https://pixnio.com/zh/%E6%A4%8D%E7%89%A9/%E8%8A%B1/%E4%B8%81%E9%A6%99%E8%8A%B1-%E5%8F% ...

  9. numpy的基本API(三)——索引

    numpy的基本索引API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.单个元素的索引 对于一维数组,索引方式与内置的List相同.正索引从0开始,负 ...

  10. 理解web服务器和数据库的负载均衡以及反向代理

    这里的“负载均衡”是指在网站建设中应该考虑的“负载均衡”.假设我们要搭建一个网站:aaa.me,我们使用的web服务器每秒能处理100条请求,而aaa.me这个网站最火的时候也只是每秒99条请求,那么 ...