在非主键列上创建聚簇索引,将对值进行排序并仅存储在磁盘上[如果是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
答案 0 :(得分:2)
你有两个假设
Select
查询将导致逻辑订单clustered Index
在您的情况下为NAME
列这是错的。除非您在Order By
查询结果订单中提及select
,否则保证。虽然您看到结果在主键列(非聚集索引)中排序但订单无法保证
Clustered Index
列的记录以与聚集索引data pages
相同的顺序存储在logical order
中。 这又错了。 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
。索引有助于加快速度。