8.6 SQL Server筛选索引
SQL Server 筛选索引
简介
如果使用得当,非聚集索引可以大大提高查询性能。然而,非聚集索引的好处是有代价的:存储和维护。
- 首先,它需要额外的存储空间来存储索引键列的数据副本。
- 其次,当从表中插入、更新或删除行时,SQL Server需要更新关联的非聚集索引。
如果应用程序只查询表的一部分行,那么效率会很低。此时筛选索引便可以发挥作用了。
筛选索引是带有谓词(条件表达式)的非聚集索引,该谓词允许您指定应将哪些行添加到索引中。
语法:
CREATE INDEX index_name ON table_name(column_list) WHERE predicate;
其中,使用带有谓词的WHERE
子句来指定索引中应包括表的哪些行。
示例
有如下客户表:
表中的phone
字段有很多NULL
值:
SELECT SUM(CASE WHEN phone IS NULL THEN 1 ELSE 0 END) AS [Has Phone], SUM(CASE WHEN phone IS NULL THEN 0 ELSE 1 END) AS [No Phone] FROM sales.customers;
Has Phone No Phone ----------- ----------- 1267 178 (1 row affected)
phone
非常适合做过滤索引
在phone
字段上创建过滤索引:
CREATE INDEX ix_cust_phone ON sales.customers(phone) WHERE phone IS NOT NULL;
查找电话号为(281) 363-3309
的客户:
SELECT first_name, last_name, phone FROM sales.customers WHERE phone = '(281) 363-3309';
可见,查询优化器可以利用筛选索引ix_cust_phone
进行搜索。
请注意,要改进键查找,可以使用包含列的索引,其中包含索引中的first_name
和last_name
列,这个在上一篇讲过。
CREATE INDEX ix_cust_phone ON sales.customers(phone) INCLUDE (first_name, last_name) WHERE phone IS NOT NULL;
筛选索引的优点
如前所述,过滤索引可以帮助您节省空间,特别是当索引键列稀疏时。稀疏列是具有许多NULL
值的列。
此外,筛选索引可以降低维护成本,因为当关联表中的数据发生更改时,只需要更新部分数据行,而不是全部数据行。
分类:
SQL Server
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器