SQL Server 索引知识汇总(最新整理)

 更新时间:2026年07月23日 10:55:38   作者:哥本哈士奇  
在SQL Server中,索引是提高数据库查询性能的关键组件,通过为表中的一列或多列创建索引,可以加速数据的检索速度,下面给大家介绍SQL Server 索引知识汇总,感兴趣的朋友一起看看吧

摘要

本文对SQLServer中的索引进行一个知识总结。

一、堆表(Heap)

未创建聚集索引的表称为堆表,数据无序追加,无统一排序。

  • 优势:写入极快,适合日志、流水表等持续大批量写入场景
  • 缺点:无索引时查询必须全表扫描,数据量越大成本越高
-- 创建堆表(无聚集索引)
CREATE TABLE TestData (
    TestId integer, TestName varchar(255), TestDate date,
    TestType integer, TestData1 integer, TestData2 varchar(100),
    TestData3 XML, TestData4 varbinary(max), TestData4_FileType varchar(3)
);
ALTER TABLE TestData REBUILD;   -- 重建堆表
DROP TABLE TestData;            -- 删除表

二、聚集索引(Clustered Index)

B+树结构,索引键与完整行数据存储在叶子节点。一张表最多1个聚集索引,创建后不再为堆表。

  • 优势:WHERE条件含索引键时直接定位整行,无需回表;ORDER BY与索引键一致时省去排序开销
  • 缺点:DML维护成本高——键值更新会触发页拆分/迁移,INSERT/DELETE也有额外开销
CREATE CLUSTERED INDEX IX_TestData_TestId ON dbo.TestData (TestId);
ALTER INDEX IX_TestData_TestId ON TestData REBUILD WITH (ONLINE = ON);   -- 在线重建
DROP INDEX IX_TestData_TestId ON TestData WITH (ONLINE = ON);           -- 在线删除

三、非聚集索引(Non-Clustered Index)

B+树结构,叶子节点不存完整行,仅存行定位指针(指向聚集索引键或堆表的RID)。

  • 优势:可建多个索引适配不同查询;DML维护开销低于聚集索引
  • 缺点:增删改仍需维护所有非聚集索引;索引越多写入越慢,需权衡查询与写入性能
CREATE INDEX IX_TestData_TestDate ON dbo.TestData (TestDate);
ALTER INDEX IX_TestData_TestDate ON TestData REBUILD WITH (ONLINE = ON);
DROP INDEX IX_TestData_TestDate ON TestData;

四、列存储索引(Column Store Index)

按列存储的特殊索引,分为聚集列存储与非聚集列存储两种。

  • 优势:专为DW/大宽表/海量事实表设计,聚合分析性能提升最高100倍,高压缩算法存储占用最高减少90%
  • 缺点:不支持 varchar(max)/nvarchar(max)/XML/text/image/CLR 类型;开启复制/CDC的表无法使用;DML写入开销远高于行式索引
-- 创建聚集列存储索引
CREATE CLUSTERED COLUMNSTORE INDEX CIX_TestData_TestType ON dbo.TestData (TestType)
    WITH (DATA_COMPRESSION = COLUMNSTORE);
DROP INDEX CIX_TestData_TestType;

五、XML 索引

专用于 XML 类型字段,分为主XML索引二级XML索引(PATH/VALUE/PROPERTY),前置要求:表必须有主键聚集索引。

  • 优势:避免每次查询加载解析完整XML文档,适合大XML字段局部读取
  • 缺点:磁盘占用极高(XML每个标签生成多条索引记录);XML更新时同步维护带来写入损耗
CREATE PRIMARY XML INDEX PXML_TestData_TestData3 ON TestData (TestData3);
CREATE XML INDEX XMLPATH_TestData_TestData3 ON TestData (TestData3)
    USING XML INDEX PXML_TestData_TestData3 FOR PATH;
CREATE XML INDEX XMLPROPERTY_TestData_TestData3 ON TestData (TestData3)
    USING XML INDEX PXML_TestData_TestData3 FOR PROPERTY;
CREATE XML INDEX XMLVALUE_TestData_TestData3 ON TestData (TestData3)
    USING XML INDEX PXML_TestData_TestData3 FOR VALUE;

六、全文索引(Full-Text Index)

将文本拆分为分词(Token)构建索引,索引文件独立存放于全文目录,不混存于数据文件。

  • 优势:支持大文本/二进制字段检索(char/varchar/nvarchar/text/XML/varbinary(max)/FILESTREAM);支持精确短语、前缀模糊、变形检索、邻近词、同义词、加权权重等高级检索
  • 缺点:全文检索由独立 MSFTESQL 服务执行,会与 SQL Server 争抢内存/IO 资源
CREATE FULLTEXT CATALOG fulltextCatalog AS DEFAULT;
CREATE FULLTEXT INDEX ON dbo.TestData (TestData4 TYPE COLUMN TestData4_FileType)
    KEY INDEX PK_TestData WITH STOPLIST = SYSTEM;
ALTER FULLTEXT CATALOG fulltextCatalog REBUILD;
DROP FULLTEXT INDEX ON dbo.TestData;

七、索引衍生变体

1. 包含列索引(Included Columns)

非聚集索引扩展:将指定字段存入叶子节点,实现"类聚集索引"效果,免去回表。支持 text/ntext/image 外的绝大多数类型。

CREATE NONCLUSTERED INDEX IX_TestData_TestDate_incTestData3 ON TestData (TestDate)
    INCLUDE (TestData3);

2. 函数索引(基于计算列)

SQL Server 不直接支持函数索引,通过持久化计算列模拟实现。

ALTER TABLE TestData ADD TestDatePlus7Days AS DATEADD(DAY, 7, TestDate) PERSISTED;
CREATE NONCLUSTERED INDEX IX_TestData_TestDate_Plus7Days ON TestData (TestDatePlus7Days);

3. 筛选索引(Filtered Index)

带 WHERE 条件的非聚集索引,缩小索引体积、降低维护成本。仅当查询条件与索引 WHERE 完全匹配时优化器才会选用。

CREATE INDEX IX_TestData_TestDate_TestTypeEq1 ON TestData (TestDate) WHERE TestType = 1;

4. 覆盖索引(Covering Index)

设计思路:查询所有字段要么是索引键,要么在 INCLUDE 中,完全消除回表,性能最优。

CREATE INDEX IX_TestData_TestDate_TestType_AllData ON TestData (TestDate, TestType)
    INCLUDE (TestData1, TestData2, TestData3, TestData4);
-- 该查询完全走索引,无需访问原表
SELECT TestData1, TestData2, TestData3, TestData4
FROM TestData
WHERE TestDate > CURRENT_TIMESTAMP - 1 AND TestType = 1;

到此这篇关于SQL Server 索引知识汇总的文章就介绍到这了,更多相关SQL Server 索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQLServer 管理常用SQL语句

    SQLServer 管理常用SQL语句

    SQL Server管理常用SQL语句,方便快速的解决问题。
    2009-08-08
  • c++基础语法:虚继承

    c++基础语法:虚继承

    虚继承概念的提出主要是为了解决C++多继承的问题。下面我就为大家列举一个简单的例子
    2013-09-09
  • Sql Server datetime问题

    Sql Server datetime问题

    SQL SERVER数据库用datetime类型的时候 需要注意的地方
    2009-03-03
  • SQL从慢查询到高效查询实战优化案例

    SQL从慢查询到高效查询实战优化案例

    本文详细介绍了SQL优化的黄金流程,包括监控慢查询、分析执行计划、针对性优化和验证效果,帮助读者全面掌握SQL优化技巧,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 如何在navicat中利用sql语句建表+添加数据

    如何在navicat中利用sql语句建表+添加数据

    这篇文章主要给大家介绍了关于如何在navicat中利用sql语句建表+添加数据的相关资料,Navicat是一套快速,专为简化数据库的管理及降低系统管理成本而设,它的设计符合数据库管理员、开发人员及中小企业的需要,需要的朋友可以参考下
    2023-10-10
  • MySql删除和更新操作对性能有影响吗

    MySql删除和更新操作对性能有影响吗

    做编程的同胞都知道,所有的项目都是离不开数据库,数据库离不开增删改查操作,那么删除和更新操作对性能有影响吗?下面小编给大家详细介绍MySql删除和更新对性能的影响,需要的朋友可以参考下
    2015-08-08
  • ODBC连接数据库以SQLserver为例图文详解

    ODBC连接数据库以SQLserver为例图文详解

    开放数据库互连(ODBC)是微软提出的数据库访问接口标准,开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言,下面这篇文章主要给大家介绍了关于ODBC连接数据库以SQLserver为例的相关资料,需要的朋友可以参考下
    2023-05-05
  • 有关sqlserver帐号被禁用的处理方法

    有关sqlserver帐号被禁用的处理方法

    这篇文章主要介绍了有关sqlserver帐号被禁用处理方法,需要的朋友可以参考下
    2017-12-12
  • SQL 面试题:窗口函数的价值,不只在于“写法高级”

    SQL 面试题:窗口函数的价值,不只在于“写法高级”

    窗口函数的核心价值在于‌保留明细行的同时完成分组聚合计算‌,解决“既要分组统计,又要展示原始行”的矛盾,而非单纯追求语法复杂度 ,‌‌本文介绍SQL面试题:窗口函数的价值,不只在于“写法高级”,感兴趣的朋友跟随小编一起看看吧
    2026-07-07
  • SQL行转列和列转行代码详解

    SQL行转列和列转行代码详解

    这篇文章主要介绍了SQL行转列和列转行代码详解,涉及动态方案和静态方案两种处理方式,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10

最新评论