所以,我有一个表,通常在24小时内插入大约300-500K行。数据也会不断地从这个表中查询。有一个Intime列保存插入数据的日期+时间。这些数据需要保存3个月。最终用户还可以调用API,该API将在同一时间段内更新用户所有记录上的状态标志。通常情况下,我们只是根据月份或日期对表进行分区,并设置一个滚动分区来处理这个问题。
但是考虑到数据实际上可以通过单个查询跨分区更新,对表进行分区有什么缺点吗?任何关于如何处理这样一个桌子的设计建议也很感激。
CREATE TABLE [dbo].[tbl_Message](
[MessageId] [bigint] IDENTITY(1,1) NOT NULL,
[MessageText] [nvarchar](max),
[UserId] [varchar](100),
[Status] [bit] NULL,
[Intime] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
在不同的分区中更新单个查询中的行是不需要考虑的。无论是否使用表分区,索引都是提高性能和并发性的关键。
表分区可以通过滑动窗口提高大型表的可管理性,但是在这样做之前有一些考虑。滑动窗口需要对齐,因此必须对所有索引进行分区,分区列需要成为主键(这里假设是MessageID
)和所有其他唯一索引的一部分。
同样,没有指定分区列的查询将需要访问所有分区。因此,像SELECT * [dbo].[tbl_Message] WHERE MessageID = 1;
这样的查询将需要90+索引搜索,并以3个月的日滑动日返回单行。请务必检查执行计划,以避免性能下降。