【问题标题】:SQL Server : clustered and nonclustered indexing [duplicate]SQL Server:聚集和非聚集索引[重复]
【发布时间】:2014-04-27 18:13:36
【问题描述】:

我正在尝试区分 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

我必须做些什么来解决这个差异?

【问题讨论】:

  • @David,我阅读了有关索引的文章,我想知道是否可以使用 SELECT 查询在这两种情况下显示行的顺序不同
  • @Michael Gardner,不,没有帮助
  • 创建一个两列的表可能更容易,在第 1 列有一个聚集索引,在第 2 列有一个非聚集索引。这将更接近真实的表结构。然后,您可以删除并重新创建索引,并切换聚集/非聚集列以显示重新排序。

标签: sql indexing cluster-computing


【解决方案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
    

    【讨论】:

    • 谢谢!这就是我需要的
    • 好的。那么请标记为答案。
    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 2012-10-01
    • 2018-05-08
    • 2013-08-20
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多