首页 > 数据库 >SQL Server索引知识汇总(最新整理)

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

来源:互联网 2026-07-25 08:45:02

SQLServer索引类型包括堆表、聚集与非聚集索引、列存储索引、XML索引、全文索引及包含列、函数、筛选、覆盖等衍生变体,堆表无索引,聚集索引定序,非聚集索引独立,列存储分析,全文搜索,各有适用场景与性能权衡,为查询优化与数据维护提供全面参考。

摘要

聊到SQL Server,索引是绕不开的核心话题。本文系统梳理了SQL Server中几种常见的索引类型,包括各自的长处与短板,并附上对应的SQL示例。无论你是刚接触索引的新手,还是想系统回顾的开发者,都能从中获得一份全面的参考。

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

长期稳定更新的攒劲资源: >>>点此立即查看<<<

一、堆表(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+树结构,索引键和完整行数据都存储在叶子节点上。一张表最多只能有一个聚集索引,有了它,该表就不再是堆表。

  • 优势: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)

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

  • 优势:专为数据仓库、大宽表、海量事实表设计,聚合分析性能提升最高可达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;

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备2026025700号-3 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。