非主键列上的聚簇索引

时间:2017-01-29 10:55:00

标签: sql sql-server

在非主键列上创建聚簇索引,将对值进行排序并仅存储在磁盘上[如果是VARCHAR然后是A-Z]并且不必在查询结果集上显示它们吗?

虽然插入的记录不是为了为什么查询输出总是根据主键列[未聚集]进行排序?

CREATE TABLE TEST ( N INTEGER NOT NULL, NAME VARCHAR(10))
CREATE CLUSTERED INDEX IDX_1 ON TEST(NAME)
ALTER TABLE TEST ADD  PRIMARY KEY (N)
INSERT INTO TEST VALUES (2,'D'),(1,'C'),(4,'A'),(3,'B'),(100,'Z')
SELECT * FROM TEST
output:
N  NAME
1   C
2   D
3   B
4   A
100 Z

我认为结果集会像这样返回:

N  NAME
4   A
3   B
1   C
2   D
100 Z

3 个答案:

答案 0 :(得分:2)

你有两个假设

  1. Select查询将导致逻辑订单clustered Index在您的情况下为NAME
  2. 这是错的。除非您在Order By查询结果订单中提及select,否则保证。虽然您看到结果在主键列(非聚集索引)中排序但订单无法保证

    1. Clustered Index列的记录以与聚集索引data pages相同的顺序存储在logical order中。
    2. 这又错了。 logical order数据保存在数据页中,而不是physical order。在同一数据页面中,C可以先存储,A可以存储在第二位。只在数据页中保留逻辑顺序。

答案 1 :(得分:0)

检查上一个ALTER语句后的表架构,并且非常确定name上的聚簇索引被忽略CREATE CLUSTERED INDEX IDX_1 ON TEST(NAME);,因为您在primary key上定义了N列和任何列默认值上的定义PK会在该列上创建唯一的聚簇索引,并且表中最多只能定义一个聚簇索引。因此,排序仅在该列上。请参阅此小提琴链接http://sqlfiddle.com/#!3/0b4c8/1。如您所见,对主键定义ALTER TABLE TEST ADD PRIMARY KEY (N);进行注释实际上会根据您的聚簇索引列NAME

对表进行排序

答案 2 :(得分:0)

除非使用ORDER BY,否则SQL查询产生的行的顺序是特定于实现的。聚簇索引是关于物理数据结构的。如果您想要查询结果的特定订单,则可以使用ORDER BY。索引有助于加快速度。