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

时间:2014-03-20 17:30:38

标签: sql indexing cluster-computing

我正在尝试区分clusterednonclustered索引。我想表明这个索引在表中以不同的顺序放置行。但我的查询总是显示相同的结果:

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

我需要做些什么才能解决这个问题?

2 个答案:

答案 0 :(得分:2)

我看到你要展示的内容,但我并没有真正看到为什么。而且我认为其原因可能就是为什么演示无效。

聚簇索引确定磁盘上存储记录的顺序。但是,它确实保证任何给定的查询每次都以该确切的顺序返回记录。它们巧合地可能以该顺序返回(例如,如果在表创建期间指定索引后按顺序插入它们,这在大多数情况下会发生),但它不是保证< / em>的

SELECT操作应该指定如果该顺序很重要,则返回数据的顺序。 (并且数据库引擎非常善于根据索引优化它。)不要担心磁盘上的顺序,聚集索引会处理这个问题。除了这两件事,订单无法保证。它经常按照预期巧合排列,但不能保证。

答案 1 :(得分:1)

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

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