SQL Server:聚簇索引和非聚簇索引

SQL Server : clustered and nonclustered indexing

本问题已经有最佳答案,请猛点这里访问。

我想知道clusterednonclustered指数之间的区别。我想说明这个索引在表中按不同的顺序放置行。但我的查询始终显示相同的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE test_table (ID tinyint)
GO

INSERT INTO test_table VALUES (2), (1), (3)

--CREATE UNIQUE CLUSTERED INDEX Clustered_Index
CREATE INDEX Nonclustered_Index
ON test_table (ID);
GO

SELECT *
FROM test_table;
GO

DROP TABLE test_table;
GO

我要做什么来解决这个差异?


我知道你想展示什么,但我不知道为什么。我认为这可能是演示不起作用的原因。

聚集索引决定记录在磁盘上的存储顺序。但是,它并不保证任何给定的查询每次都会以该确切顺序返回记录。巧合的是,它们可能会按该顺序返回(例如,如果您在创建表的过程中指定了索引之后按该顺序插入它们,在大多数情况下都会发生这种情况),但这并不能保证。

SELECT操作应指定如果认为该顺序很重要,返回数据的顺序。(而且数据库引擎非常擅长根据索引优化它。)不要担心磁盘上的顺序,聚集索引会处理这个问题。除非这两件事,否则秩序是无法保证的。它通常是巧合地按预期订购的,但不能保证。


在表上创建非聚集索引时,它是指向聚集索引的指针(如果存在)。但是,如果没有,那么表中的数据将按非聚集索引排序。我能想到的唯一方法是在表上有两个索引,并通过让它们都不集群来显示查询顺序,然后使一个集群,然后使另一个集群(注意,您只能有一个集群索引):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE test_table (ID tinyint, ID2 tinyint);
GO

---CREATE NONCLUSTERED INDEX non_clustered_Indexa
CREATE INDEX non_clustered_Indexa
ON test_table (ID);

--CREATE NONCLUSTERED INDEX non_clustered_Indexb
CREATE INDEX non_clustered_Indexb
ON test_table (ID2);

INSERT INTO test_table VALUES (2, 1);
INSERT INTO test_table VALUES (1, 2);
INSERT INTO test_table VALUES (3, 3);
GO

SELECT * FROM test_table;
GO