Sql 数据在插入到非聚集索引表时进行排序

Sql 数据在插入到非聚集索引表时进行排序,sql,sql-server,indexing,Sql,Sql Server,Indexing,我目前有一张这种设计的桌子 CREATE TABLE [dbo].[test_all_DIVISION]( [all_id] [int] NOT NULL, [division_id] [int] NOT NULL, [some_value] [tinyint] NULL, CONSTRAINT [PK_test_all_DIVISION] PRIMARY KEY CLUSTERED ( [all_id] ASC, [division_id] ASC

我目前有一张这种设计的桌子

CREATE TABLE [dbo].[test_all_DIVISION](
    [all_id] [int] NOT NULL,
    [division_id] [int] NOT NULL,
    [some_value] [tinyint] NULL,
 CONSTRAINT [PK_test_all_DIVISION] PRIMARY KEY CLUSTERED 
(
    [all_id] ASC,
    [division_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
) ON [PRIMARY]
其中,all_id和division_id是引用其他表的外键 因此,在按以下顺序插入数据时

all_id  division_id   some_value
94619   1153          24
94619   1133          25
94619   1002          22
94619   1156          23
它将根据分区id进行排序,并按如下所示插入

all_id  division_id   some_value
94619   1002          22
94619   1133          25
94619   1153          24
94619   1156          23
现在,我已将该约束更改为非集群约束。 像这样

ALTER TABLE [dbo].[test_all_DIVISION]
DROP CONSTRAINT [PK_test_all_DIVISION]
GO

ALTER TABLE [dbo].[test_all_DIVISION]
ADD CONSTRAINT [PK_test_all_DIVISION] PRIMARY KEY NONCLUSTERED 
(
    [all_id] ASC,
    [division_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO
尽管如此,行为仍然没有改变,并且在向表中插入数据时,表仍在排序,其行为类似于聚集索引。
那么我做错了什么。请帮助。

插入堆时,数据没有排序。您能否澄清为什么需要按特定顺序插入数据。您可以通过使用order by来控制选择数据时的顺序

如果必须控制插入顺序,则可以添加标识列和集群

--编辑--

确保结果顺序的唯一方法是在select语句中。聚集索引只会影响数据的存储顺序

CREATE TABLE [dbo].[test_all_DIVISION](
    [id] [int] IDENTITY(1, 1) NOT NULL,
    [all_id] [int] NOT NULL,
    [division_id] [int] NOT NULL,
    [some_value] [tinyint] NULL) ON [PRIMARY];
然后控制select语句中的顺序

SELECT
    [all_id],
    [division_id],
    [some_value]
FROM
    [dbo].[test_all_DIVISION]
ORDER BY
    [id];

插入堆时,数据未排序。您能否澄清为什么需要按特定顺序插入数据。您可以通过使用order by来控制选择数据时的顺序

如果必须控制插入顺序,则可以添加标识列和集群

--编辑--

确保结果顺序的唯一方法是在select语句中。聚集索引只会影响数据的存储顺序

CREATE TABLE [dbo].[test_all_DIVISION](
    [id] [int] IDENTITY(1, 1) NOT NULL,
    [all_id] [int] NOT NULL,
    [division_id] [int] NOT NULL,
    [some_value] [tinyint] NULL) ON [PRIMARY];
然后控制select语句中的顺序

SELECT
    [all_id],
    [division_id],
    [some_value]
FROM
    [dbo].[test_all_DIVISION]
ORDER BY
    [id];

SQL表是无序的数据集。唯一控制排序顺序的是
orderby
子句。表上是否有聚集索引并不重要。SQL表是无序的数据集。唯一控制排序顺序的是
orderby
子句。表上是否有聚集索引并不重要。只需添加,即使对标识列进行群集,确保以正确顺序选择数据的唯一方法是使用order BY。上表用于存储一个列表,该列表最多包含4个条目,并且需要以相同的顺序检索以向用户显示,否则可能会混淆用户。您可以看到在division_id列上发生排序,我认为聚集索引是该操作的原因,并对其进行了更改,但仍然是相同的行为。因此,我甚至尝试用一些虚拟数据创建一个类似的模式,并在表上创建一个聚集索引并对其进行修改。现在行为得到纠正,数据按预定顺序插入。但主表中的情况并非如此。感谢@Sean能够通过您的建议解决我的问题。只需补充一下,即使对标识列进行群集,确保以正确顺序选择数据的唯一方法是使用order BY。上表用于存储一个列表,该列表最多包含4个条目,并且需要以相同的顺序检索以向用户显示,否则可能会混淆用户。您可以看到在division_id列上发生排序,我认为聚集索引是该操作的原因,并对其进行了更改,但仍然是相同的行为。因此,我甚至尝试用一些虚拟数据创建一个类似的模式,并在表上创建一个聚集索引并对其进行修改。现在行为得到纠正,数据按预定顺序插入。但主表中的情况并非如此。谢谢@Sean能够通过您的建议解决我的问题。