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能够通过您的建议解决我的问题。