鉴于:
我们有一个名为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亿行的表来说,这是一个实现预期结果的好方法吗?您有什么建议可以更有效、更有力地满足这一期望吗?
暂无答案!
目前还没有任何答案,快来回答吧!