【问题标题】:SQL Server - 2 sec inserts and 5 min archiving - How to avoid table locks?SQL Server - 2 秒插入和 5 分钟归档 - 如何避免表锁定?
【发布时间】: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


【解决方案1】:

如果您使用的是 SQL Server 2016 及更高版本,则可以使用TRUNCATE WITH partitions。与 DELETE 相比,这使用更少的锁。值得尝试先在 TEST 环境中对表进行分区。

【讨论】:

  • 据我了解,需要提前指定分区,所以我不能在动态表中使用它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2015-08-31
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
相关资源
最近更新 更多