【问题标题】:Does trigger(after insert) on table slow down inserting into this table表上的触发器(插入后)是否会减慢插入此表的速度
【发布时间】:2018-09-02 08:10:09
【问题描述】:

我有一个大表 (bo_sip_cti_event),它太大了,甚至无法对此运行查询,所以我创建了同一个表 (bo_sip_cti_event_day),在插入 bo_sip_cti_event 后添加了触发器以将所有相同的值添加到bo_sip_cti_event_day,现在我在考虑是否会显着减慢插入 bo_sip_cti_event 的速度。

那么一般来说,插入后触发器会减慢对该表的操作吗?

【问题讨论】:

    标签: postgresql triggers


    【解决方案1】:

    是的,触发器必须减慢插入速度。

    原因是关系数据库符合ACID:所有操作,包括触发器等副作用,都必须在更新事务完成之前完成。所以触发器必须同步执行,这会消耗 CPU,在你的情况下也是 I/O,这最终会花费更多时间。没有办法绕过它。

    【讨论】:

    • 因此,在每次插入 bo_sip_cti_event 时,我都会浪费时间插入 bo_sip_cti_event_day。我猜对了吗?
    • @Michu93 是的。当初始插入执行完成时,触发器内部的插入执行也必须完成。如果向事件表进行插入操作的客户端紧跟其后对日期表进行查询,他们将期望看到并保证看到日期表中的新数据。
    【解决方案2】:

    答案是肯定的:这是额外的开销,因此显然需要时间来完成额外的触发器执行的事务。

    你的设计让我怀疑:

    • 您探索了所有加快大表速度的选项。如果您有适当的索引等,甚至可以很好地处理数十亿行。但这一切都取决于表、设计、数据和查询。
    • 您的触发器到底在做什么。表名“_day”引发了问题,该表何时、何地以及如何在午夜清理干净。希望不在触发函数中,希望不在“DELETE FROM”中。

    【讨论】:

    • 这是一个包含来自电话平台-freeswitch 的所有信息的表格。我已经在 SELECTS 中使用的列上有了一些索引。不,不,我除了插入触发器功能之外什么也没做,但晚上我运行DELETE FROM bo_sip_cti_event_day,但它似乎很快,有没有更好的方法?
    猜你喜欢
    • 2021-11-07
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多