【发布时间】:2019-10-08 14:41:43
【问题描述】:
我有一个每 2 秒执行一次的插入(20 列,15000 行,在 SQL Server [传感器数据] 之外),它在 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
我想确保插入运行完美无缺且尽可能快,而不会在此归档过程中被锁定。归档开始时,插入的运行时间增加到 4-5 秒。我还将有一个 2 秒的实时查询 (Power BI) 来读取此表。
目前我在两个表的 UTCLogDateTime 列上都有一个聚集索引。
这些所有进程都必须无缝运行,而不会相互锁定表。 您对我如何实现这一点有什么建议吗?
【问题讨论】:
-
如果您在单个事务中插入、更新或删除超过 5000 行,SQL Server 将放弃行级锁定并进行 锁定升级 以独占方式锁定所涉及的整个表。因此,为避免这种情况 - 一次分批更新明显小于 5000 行。
-
你能分享插入传感器数据的代码吗?为什么不先将传感器数据插入“table1”,然后将相同的数据插入存档?这应该会减少接触的页面。然后你会像你一样做你的删除,但只在“table1”上。让档案不断增长。 marc_s 是对的。你也可以走那条路。
-
为什么不在传感器添加最新的 15,000 行后每两秒存档最旧的 15,000 行。这应该允许存档在下一次插入之前快速运行。
-
尝试在每 2 秒内使用
标签: sql-server tsql locking table-lock