SQL Server:聚集和非聚集索引[重复]
Posted
技术标签:
【中文标题】SQL Server:聚集和非聚集索引[重复]【英文标题】:SQL Server : clustered and nonclustered indexing [duplicate] 【发布时间】:2014-04-27 18:13:36 【问题描述】:我正在尝试区分 clustered
和 nonclustered
索引。我想表明这个索引在表中以不同的顺序放置行。但我的查询总是显示相同的结果:
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
我必须做些什么来解决这个差异?
【问题讨论】:
@David,我阅读了有关索引的文章,我想知道是否可以使用 SELECT 查询在这两种情况下显示行的顺序不同 @Michael Gardner,不,没有帮助 创建一个两列的表可能更容易,在第 1 列有一个聚集索引,在第 2 列有一个非聚集索引。这将更接近真实的表结构。然后,您可以删除并重新创建索引,并切换聚集/非聚集列以显示重新排序。 【参考方案1】:我明白您要演示的内容,但我真的不明白为什么。我认为原因可能是演示无法正常工作的原因。
聚集索引决定了记录在磁盘上的存储顺序。但是,它确实不保证任何给定的查询每次都会以确切的顺序返回记录。巧合的是,它们可能按该顺序返回(例如,如果您在创建表期间指定索引后按该顺序插入它们,这在大多数情况下都会发生),但这不是保证。
SELECT
操作应指定返回数据的顺序(如果该顺序被认为是重要的)。 (并且数据库引擎真的擅长根据索引进行优化。)不用担心磁盘上的顺序,聚集索引会处理这些。除非这两件事,否则无法保证订单。它通常是按预期巧合订购的,但不能保证。
【讨论】:
【参考方案2】:当您在表上创建非聚集索引时,它是指向聚集索引(如果存在)的指针。但是,如果没有,则表中的数据将按 non_clustered 索引排序。我能想到的唯一方法是在表上有两个索引,并通过让它们都是非聚集的来显示查询顺序,然后使一个聚集,然后使另一个聚集(注意你只能有一个聚集索引):
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
【讨论】:
谢谢!这就是我需要的 好的。那么请标记为答案。以上是关于SQL Server:聚集和非聚集索引[重复]的主要内容,如果未能解决你的问题,请参考以下文章