【问题标题】:Should I use database trigger in insert heavy operation table?我应该在插入繁重的操作表中使用数据库触发器吗?
【发布时间】:2020-08-27 10:40:33
【问题描述】:

我的用例是我需要将几列从表 A 复制到另一个表 B,并通过一些计算得出表 B 的其他几列的值。

根据目前的估计,每天将在表 A 中插入大约 50,000 行。

表 B 应在一天结束前更新所有数据。

因此,我可以使用触发器,该触发器将在表 A 上的 INSERT 操作中调用,或者在 EOD 安排一些作业,从表 A 批量读取所有数据,进行一些计算并插入表 B。

由于我是新手,我不确定应该为这个用例选择哪个选项。有什么更好的方法建议吗?

到目前为止,我所读到的关于触发器的内容,如果频繁调用它们会降低数据库的性能。

由于每天大约会发生 50,000 次插入操作,所以我可以假设 50,000 次属于触发无益的繁重操作吗?

编辑 1:每天 50,000 次插入操作将达到 100,000 次插入操作

使用 Postgres 数据库。

【问题讨论】:

  • 因为您只需要在预定时间获取表 B 中的数据,因此预定作业总是会更好。如果您同时需要表 B 中的数据,则应使用触发器。
  • @AkhileshMishra 未安排时间,但在 EOD 之前,所有数据都应复制到表 B 中
  • EOD 是指在工作时间内?如果是,则有 2 种情况。 1. 如果您在固定时间在 EOD 之前停止在 TableA 中的插入,然后计划在固定时间传输 TableB 中的值,那么调度程序会更好 2. 如果您不能遵守第 1 点,请使用触发器。
  • 8 小时内 50000 次插入并不多。如果你写好触发器,那么insert 的减速将不会被注意到。去扳机。您可以少操心一件事情。
  • 我认为对于简单的after insert for each row 触发器来说,100000 甚至更多仍然可以。但是,如果当天没有交易,我根本不喜欢复制最后一天的最后一笔交易。数据就是数据,它应该是干净和正确的。如果没有交易,则不应有记录。考虑在提取查询中实现最后一天的逻辑。但要保持数据干净。

标签: postgresql triggers


【解决方案1】:

如果您要对未编制索引的表进行批量复制,添加一个简单的触发器会大大降低您的速度(例如 5 倍)。但是,如果您使用单行 INSERT 或表已编入索引,则添加简单触发器的边际减速将非常小。

每天 50,000 次插入并不是很多。使用触发器应该没有问题,除非触发器必须在每次调用时扫描一个大表或其他东西。

【讨论】:

  • 再次确认后才知道5万可能会涨到10万。如果我的目标表有索引,您仍然认为触发器是一个不错的选择吗?
  • 我想我将无法使用触发器,因为如果假设 1 天没有交易发生,那么用例是复制前一天的最后一个交易,这是触发器无法实现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多