如何在SQL Server中创建聚类索引

151 阅读4分钟

索引在数据库中发挥着关键作用。它们就像书中的索引一样,允许你在书中搜索和定位各种项目和主题。数据库中的索引也有类似的作用,有助于加快数据库中存储记录的搜索速度。本文将解释在SQL Server中创建集群索引的方法。

索引在数据库中起着关键作用。它们就像书中的索引一样,允许你在书中搜索和定位各种项目和主题。数据库中的索引也有类似的作用,有助于加快数据库中存储的记录的搜索速度。

聚类索引是SQL Server中的索引类型之一。它被用来定义数据在表中的存储顺序。它的工作原理是对表中的记录进行排序,然后将其存储起来。

在本教程中,你将了解表的聚类索引以及如何在SQL Server中定义聚类索引。

SQL Server聚类索引

在了解如何在SQL Server中创建一个聚类索引之前,让我们先了解一下索引的工作原理。

考虑下面的示例查询,用一个基本结构创建一个表:

CREATE DATABASE product_inventory;
USE product_inventory;
CREATE TABLE inventory (
    id INT NOT NULL,
    product_name VARCHAR(255),
    price INT,
    quantity INT
);

接下来,向表中插入一些样本数据,如下面的查询所示

INSERT INTO inventory(id, product_name, price, quantity) VALUES
(1, 'Smart Watch', 110.99, 5),
(2, 'MacBook Pro', 2500.00, 10),
(3, 'Winter Coats', 657.95, 2 ),
(4, 'Office Desk', 800.20, 7),
(5, 'Soldering Iron', 56.10, 3),
(6, 'Phone Tripod', 8.95, 8 );

上面的示例表没有在其列中定义主键约束。因此,SQL Server将记录存储在一个无序的结构中。这个结构被称为 "堆"。

假设你需要执行一个查询来定位表中的一个特定行?在这种情况下,它将迫使SQL Server扫描整个表来定位匹配的记录。

例如,考虑一下这个查询

SELECT * FROM inventory WHERE quantity = 8;

如果你在SSMS中使用估计的执行计划,你会发现这个查询扫描了整个表来定位一条记录。

虽然在上述的小数据库中,性能几乎不明显,但在有大量记录的数据库中,查询可能需要更长的时间来完成。

解决这种情况的方法是使用一个索引。在SQL Server中有各种类型的索引。然而,我们将主要关注聚类索引。

如前所述,聚类索引以排序的形式存储数据。一个表可以有一个聚类索引,因为我们只能以一种逻辑顺序对数据进行排序。

一个聚类索引使用B树结构来组织和排序数据。这使你能够执行插入、更新、删除和更多操作。

注意在前面的例子中,该表没有主键。因此,SQL Server不创建任何索引。

然而,如果你创建一个有主键约束的表,SQL Server会自动从主键列创建一个聚类索引。

看看当我们创建带有主键约束的表时会发生什么。

CREATE TABLE inventory (
    id INT NOT NULL PRIMARY KEY,
    product_name VARCHAR(255),
    price INT,
    quantity INT
);

如果你重新运行选择查询并使用估计的执行计划,你会看到查询使用了一个聚类索引,如:

SELECT * FROM inventory WHERE quantity = 8;

在SQL Server Management Studio上,你可以通过扩展索引组来查看一个表的可用索引,如图所示

当你向一个包含聚类索引的表添加主键约束时,会发生什么?在这种情况下,SQL Server会在一个非聚类索引中应用该约束条件。

SQL Server创建聚类索引

你可以使用SQL Server中的CREATE CLUSTERED INDEX语句创建一个聚类索引。这主要用于目标表没有主键约束的情况。

例如,考虑下面这个表

DROP TABLE IF EXISTS inventory;
CREATE TABLE inventory (
    id INT NOT NULL,
    product_name VARCHAR(255),
    price INT,
    quantity INT
);

由于该表没有主键,我们可以手动创建一个聚类索引,如下面的查询所示。

CREATE clustered INDEX id_index ON inventory(id);

上面的查询使用id列在inventory的表上创建了一个名字为id_index的聚类索引。

如果我们在SSMS中浏览索引,我们应该看到id_index为。

总结!

在本指南中,我们探讨了SQL Server中的索引和聚类索引的概念。我们还介绍了如何在数据库表中创建一个聚类键。