Sql server SQL Server—2秒插入和5分钟存档—如何避免表锁定?

Sql server SQL Server—2秒插入和5分钟存档—如何避免表锁定?,sql-server,tsql,locking,table-lock,Sql Server,Tsql,Locking,Table Lock,我有一个insert,每2秒执行一次,20列,15000行,SQL Server[sensor data]之外,它在200毫秒内运行。我希望在此表中只保留10分钟的数据总和~4.500.000行,然后将最早的5分钟存档移到另一个存档表中,该表将存储50天,数十亿行。用于存档的存储过程: begin tran declare @UTC_min datetime2(2) = (select TOP 1 UTCLogDateTime from table1 order by UTCLogDateTi

我有一个insert,每2秒执行一次,20列,15000行,SQL Server[sensor data]之外,它在200毫秒内运行。我希望在此表中只保留10分钟的数据总和~4.500.000行,然后将最早的5分钟存档移到另一个存档表中,该表将存储50天,数十亿行。用于存档的存储过程:

begin tran

declare @UTC_min datetime2(2) = (select TOP 1 UTCLogDateTime from table1 order by UTCLogDateTime asc)
declare @UTC_copy datetime2(2) = dateadd(minute,5,@UTC_min)

INSERT INTO archive_table
SELECT *
FROM table1
where UTCLogDateTime<@UTC_copy 

delete top(100000) from table1 where UTCLogDateTime<@UTC_copy 
WHILE @@rowcount > 0
BEGIN 
delete top(100000) from table1 where UTCLogDateTime<@UTC_copy
END 

commit
我希望确保insert尽可能完美、快速地运行,而不会被此归档过程锁定。存档开始时,insert的运行时间将增长到4-5秒。我还将有一个2秒的实时查询权限BI来读取此表

目前,我在两个表的UTCLogDateTime列上都有一个聚集索引

所有这些进程都必须无缝运行,而不必相互锁定表。
您对我如何实现这一目标有何建议?

如果您使用的是SQL Server 2016及以上版本,您可以使用。与DELETE相比,它使用的锁更少。值得首先尝试在测试环境中对表进行分区。

如果在单个事务中插入、更新或删除超过5000行,SQL Server将放弃行级锁定,并将执行锁升级以独占方式锁定所涉及的整个表。因此,为了避免这种情况-一次批量更新明显小于5000行。您可以共享插入传感器数据的代码吗?为什么不先将传感器数据插入表1,然后将相同的数据插入存档?这将减少被触摸的页面。然后,您将按照与表1相同的方式执行删除操作。只需让归档不断增长。不过马克·奥斯是对的。你也可以这样做。为什么不在传感器添加最新的15000行之后,每两秒钟归档最旧的15000行呢。这将允许存档在下一次插入之前快速运行。据我所知,使用分区进行存档需要提前指定,因此我无法在dinamic表中使用分区。