sql—向现有表中添加自动递增的列

jum4pzuy  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(314)

鉴于:
我们有一个名为events的表,目前包含大约1亿行:

CREATE TABLE [dbo].[Events](
    [Id] [uniqueidentifier] NOT NULL,
    [AggregateId] [uniqueidentifier] NOT NULL,
    [SourceType] [varchar](500) NOT NULL,
    [SourceId] [nvarchar](200) NOT NULL,
    [Timestamp] [datetimeoffset](4) NOT NULL,
    [SerializedJson] [nvarchar](max) NOT NULL,
    [EventDataType] [varchar](500) NOT NULL,
 CONSTRAINT [PK_tblCepEvent_Id] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [UData]
) ON [UData] TEXTIMAGE_ON [UData]
GO

ALTER TABLE [dbo].[tblCepEvent] ADD  CONSTRAINT [DF_tblCepEvent_Id]  DEFAULT (newid()) FOR [Id]
GO

我们在sourceid列上还有一个非聚集索引

CREATE NONCLUSTERED INDEX [IX_tblCepEvent_SourceId] ON [dbo].[tblCepEvent] ([SourceId] ASC)
GO

期望值:
我们希望添加一个新的整数列,该列包含自动递增的值,其顺序与现有行的timestamp列相同。背后的理念;我们正在处理大量数据,其中一些数据具有相同的时间戳值,因此我们希望能够按照插入的顺序对它们进行排序。
尝试:
为了使自动递增的值与timestamp列的顺序相同,我删除了所有现有索引,然后在timestamp列上创建了一个升序聚集索引。

-- 1 - drop primary key constraint
ALTER TABLE dbo.tblCepEvent DROP CONSTRAINT [PK_tblCepEvent_Id]
GO

-- 2- drop index on SourceId
DROP INDEX [IX_tblCepEvent_SourceId] ON dbo.tblCepEvent
GO

-- 3 - create a temporary asc clustered index on timestamp column
CREATE CLUSTERED INDEX [CIX_tblCepEvent_Timestamp] ON dbo.tblCepEvent ([Timestamp] ASC)
GO

然后我尝试创建新的列。

-- 4 - create auto incremented column
ALTER TABLE dbo.tblCepEvent ADD OrderIndex BIGINT IDENTITY(1, 1) NOT NULL
GO

创建此列之后,我计划删除timestamp列上的临时索引,然后返回并在sourceid列上创建主键和非聚集索引。但不知怎么的,出了点问题,查询锁定了数据库,所以我不得不取消查询。
在最后一次尝试之前,我在一个较小的数据集(100万行)上测试了这种方法,并观察到它可以完成这项工作。现在我的问题是:对于一个拥有超过1亿行的表来说,这是一个实现预期结果的好方法吗?您有什么建议可以更有效、更有力地满足这一期望吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题