2016 - 2024

感恩一路有你

聚集索引和非聚集索引

浏览量:3895 时间:2024-06-29 10:25:09 作者:采采

在SQL Server数据库中,索引分为聚集索引和非聚集索引。聚集索引是一张表只能有一个的索引,默认情况下表的主键就是聚集索引,也可以将非主键列设置为聚集索引。聚集索引会按照索引列的规则对数据进行排列存储。而非聚集索引是一张表可以有多个的索引,物理数据存储不会强制按照非聚集索引的顺序排列。一个索引最多可以有16个索引列,但是一张表最好不要超过5个索引。每当表的数据发生变化(增、删、改),每个索引都需要按照规则更新索引位置。

新建一张不带主键的表

使用以下SQL语句可以创建一张名为IndexTable的测试表,该表不包含主键:

CREATE TABLE IndexTable(
    Id varchar(36) NOT NULL,
    IndexCol1 varchar(50) NULL,
    IndexCol2 varchar(50) NULL,
    IndexCol3 varchar(50) NULL
);

设置主键,查看聚集索引

要设置Id列为主键,可以使用以下SQL语句:

ALTER TABLE IndexTable ADD CONSTRAINT pk_Id PRIMARY KEY (Id);

设置完主键后,默认会将主键列设置为聚集索引。

设置非聚集索引

可以使用以下SQL语句将IndexCol1列设置为非聚集索引:

CREATE NONCLUSTERED INDEX non_index_col1 ON IndexTable(IndexCol1);

插入测试数据

可以使用以下SQL语句插入5行记录到IndexTable表中:

INSERT INTO IndexTable (Id, IndexCol1, IndexCol2, IndexCol3)
VALUES ('1', '第1行第1列', '第1行第2列', '第1行第3列'),
       ('2', '第2行第1列', '第2行第2列', '第2行第3列'),
       ('3', '第3行第1列', '第3行第2列', '第3行第3列'),
       ('4', '第4行第1列', '第4行第2列', '第4行第3列'),
       ('5', '第5行第1列', '第5行第2列', '第5行第3列');

删除部分测试数据

可以使用以下SQL语句删除IndexCol1为'第2行第1列'或'第4行第1列'的记录:

DELETE FROM IndexTable WHERE IndexCol1  '第2行第1列' OR IndexCol1  '第4行第1列';

查看索引碎片比例

使用以下SQL命令可以查看IndexTable表的索引碎片率:

DBCC SHOWCONTIG('IndexTable');

当碎片率较高时,可以考虑重建索引。

重建索引

在建立索引后,当删除数据时,索引行的位置会被删除,但索引中会留下空白。随着时间的推移,索引中会积累很多空白,这就是索引碎片。此时可以通过重建索引来消除索引碎片。

可以使用以下SQL命令来重建索引:

DBCC DBREINDEX('IndexTable');

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。