Sql 简明教程

SQL - Clustered Index

数据库中的 index 是一个数据结构,有助于提高从表和视图中检索特定数据的速度。

表中的数据以名为“堆”的无序数据结构形式存储,其中行以没有任何特定顺序的方式放置。因此,从表中检索数据时,查询优化器必须扫描整个表以查找所请求的行。此过程可能十分耗时,尤其是在我们处理大型表时。为了加速数据检索,SQL 提供了一个称为索引的数据对象,该对象以特定方式存储和组织表数据,从而允许更快速地访问数据。

SQL Clustered Indexes

SQL 中的 clustered index 是一种索引,它决定数据值在表中存储的物理顺序。

在指定列上定义聚集索引时,在创建新表期间,将按排序顺序将数据插入该列中。这有助于更快地检索数据,因为数据以特定顺序存储。

  1. 建议仅对一张表使用一个聚集索引。如果在同一张表上创建多个聚集索引,则该表将不得不以多个顺序存储相同的数据,这是不可能的。

  2. 当我们尝试对表创建主键约束时,将自动在表上创建一个唯一聚集索引。然而,聚集索引与主键不同。主键是一种约束,将唯一性强加于列或列集,而聚集索引则决定表中数据的物理顺序。

Syntax

以下是在 SQL Server 中创建聚集索引的语法 −

CREATE INDEX index_name ON table_name(column_name [asc|desc])

其中,

  1. index_name :指定要赋予所创建索引的名称。

  2. column_name :指定将按指定顺序编入索引的列。

  3. asc|desc :指定数据应排序的顺序(asc - 升序,desc - 降序)。默认排序顺序为升序。

Example

在此示例中,让我们在 SQL Server 中的表上创建一个聚集索引。为此,我们需要首先使用以下查询创建一个名为 CUSTOMERS 的表 −

CREATE TABLE CUSTOMERS(
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE  INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (20, 2)
);

现在,使用以下查询将一些值插入 CUSTOMERS 表中 −

INSERT INTO CUSTOMERS VALUES
(7, 'Muffy', '24', 'Indore', 5500),
(1, 'Ramesh', '32', 'Ahmedabad', 2000),
(6, 'Komal', '22', 'Hyderabad', 9000),
(2, 'Khilan', '25', 'Delhi', 1500),
(4, 'Chaitali', '25', 'Mumbai', 6500),
(5, 'Hardik','27', 'Bhopal', 8500),
(3, 'Kaushik', '23', 'Kota', 2000);

该表已在 SQL Server 数据库中成功创建。

ID

NAME

AGE

ADDRESS

SALARY

7

Muffy

24

Indore

5500.00

1

Ramesh

32

Ahmedabad

2000.00

6

Komal

22

Hyderabad

9000.00

2

Khilan

25

Delhi

1500.00

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

3

Kaushik

23

Kota

2500.00

现在,让我们使用以下查询在名为 ID 的列上创建一个聚集索引 −

CREATE CLUSTERED INDEX CLU_ID ON CUSTOMERS(ID ASC);

Output

执行以上查询后,输出显示如下 −

Commands Completed Successfully.

Verification

要验证是否在 ID 列上定义了聚集索引,请检查 CUSTOMERS 表的记录是否按使用以下查询检索时对它们排序 −

SELECT * FROM CUSTOMERS;

表的记录按名为 ID 的列中的值按升序排序。

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

2000.00

2

Khilan

25

Delhi

1500.00

3

Kaushik

23

Kota

2500.00

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

6

Komal

22

Hyderabad

9000.00

7

Muffy

24

Indore

5500.00

Creating Clustered Index on Multiple Columns

通过以下示例,让我们了解在表的多个列上创建聚集索引时它如何工作。

考虑以前创建的 CUSTOMERS 表而非创建一个新表,并使用以下查询在此表的多个列(例如 AGE 和 SALARY)上定义一个聚集索引 −

CREATE CLUSTERED INDEX MUL_CLUS_ID
ON CUSTOMERS (AGE, SALARY ASC);

Output

当我们执行上述查询时,输出将获得如下:

Commands Completed Successfully.

Verification

现在,让我们验证列 AGESALARY 中的值是否已排序 −

SELECT * FROM CUSTOMERS;

正如我们在下面的表格中看到的,记录仅根据 AGE 列中的值进行排序,而不是 SALARY 列中的值。因此,建议在表上只有一簇索引。

ID

NAME

AGE

ADDRESS

SALARY

6

Komal

22

Hyderabad

9000.00

3

Kaushik

23

Kota

2500.00

7

Muffy

24

Indore

5500.00

2

Khilan

25

Delhi

1500.00

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

1

Ramesh

32

Ahmedabad

2000.00