如何正确错开数千个插入,以免锁定 table?

How do I properly stagger thousands of inserts so as not to lock a table?

我有一台服务器可以接收来自世界各地数千个地点的数据。该服务器定期连接到我的数据库服务器并使用多插入插入记录,每个多插入一次约 11,000 行,最多 6 个插入语句。发生这种情况时,所有 6 个进程都会锁定正在插入的 table。

我想弄清楚的是导致锁定的原因?我最好将我的多插入限制为一次说 100 行并端到端地进行吗?我用什么作为指南?

数据库服务器有 100GB RAM 和 12 个处理器。它很少被使用,但是当这些插入进来时,每个人都会冻结几分钟,这会扰乱人们 运行 报告等

感谢您的任何建议。我知道我需要交错插入,我只是想问一下推荐的方法是什么。

更新:我错了。我和程序员谈过,他说有一个 perl 程序 运行 可以尽可能快地向服务器发送单个插入。不是多插入。有(当前)6 个这样的 perl 进程同时 运行。其中一个正在执行 91000 个插入,一次一个。也许因为我们有很多 RAM,多插入会更好吗?

你的问题缺少关于系统结构的大量细节。此外,如果您的数据库 运行 在具有 100 GB RAM 的服务器上,您应该可以访问专业的 DBA,而不是依赖互联网论坛。

但是,正如 lad2025 在评论中建议的那样,暂存 table 可能可以解决您的问题。您的锁定可能是由索引引起的,也可能是由触发器引起的。建议将数据加载到暂存 table。然后,从暂存 table 中悠闲地将数据加载到最终 table.

一种可能性是执行 11,000 次插入,比如说每秒一次(这将需要大约三个小时)。尽管执行插入有更多的开销,但每个都是自己的事务并且锁定时间会很短。

当然,一次只插入1条记录可能不是最优的。也许 10 或 100 甚至 1000 就足够了。您可以使用事件调度程序管理插入。

并且,这假设锁定根据输入数据量进行缩放。这是一个假设,但在没有其他信息的情况下我认为这是一个合理的假设。