我们的一张表上有一个 After Insert 和 Update 触发器。触发器基本上生成一个 json 有效负载并将其排入 RabbitMQ 系统。
今天在表上运行了一个大型插入脚本(超过 50,000 个插入)。这种情况尚未经过测试或考虑,现在我们在该数据库上遇到了性能问题。
我们注意到 RabbitMQ 的记录在很长一段时间内缓慢流入。即使数据已经存在了一段时间(因为它是 After Trigger)。
似乎 After 触发器已以某种方式排队,并且正在非常缓慢地通过系统工作。
After Trigger 事件如何跟踪执行?他们在某个地方排队吗?有什么办法可以清除它们吗?
所有触发器都在生成它们的语句在其中运行的同一事务的范围内触发。因此,如果您执行的语句的事务运行完成,那么从该语句触发的After Insert 触发器也是如此。这里有一些直截了当的信息和测试来证明这一点:
INSERT
INSERT
INSERT
所以我的猜测是您的原始
INSERT
文件仍在执行(然后可以中止并回滚),或者问题是在触发器运行之后和您用来将数据转储到 RabbitMQ 的机制之间。您可以使用
sp_WhoIsActive
来确定您的INSERT
语句是否仍在运行并获取SPID
进程的进程,以便您可以中止它并回滚。要中止,您必须运行KILL 123
(其中 123 =SPID
您的INSERT
)。旁注,如果插入 50,000 次,您的意思是一条
INSERT
语句中有 50,000 条记录,那么这很小并且应该是高性能的。如果您实际上是指 50,000 个单独INSERT
的语句,那么这是一个不同的故事,可能需要更长的时间才能完成INSERT
.