【问题标题】:Does disabling trigger also disables the index temporarily禁用触发器是否也会暂时禁用索引
【发布时间】:2013-07-30 16:09:51
【问题描述】:

我有一张标准桌子

 Column |          Type          |                     Modifiers                      
--------+------------------------+----------------------------------------------------
 id     | integer                | not null default nextval('users_id_seq'::regclass)
 name   | character varying(255) | 
 email  | character varying(255) | 
 active | boolean                | 
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)

如果我执行下一步

ALTER TABLE "users" DISABLE TRIGGER ALL

那么当我执行时

SELECT "users".* FROM "users"  WHERE "users"."id" = 1

如果我检查解释是否应该使用索引?

根据文档,在我看来,当触发器被禁用时,主键索引也被禁用。

禁用/启用 [ 副本 | ALWAYS ] TRIGGER 这些表单配置 触发属于该表的触发器。禁用的触发器是 系统仍然知道,但在触发时不执行 事件发生。对于延迟触发器,检查启用状态 事件发生时,而不是触发功能实际发生时 执行。可以禁用或启用由指定的单个触发器 名称,或表上的所有触发器,或仅用户触发器(此选项 排除内部生成的约束触发器,例如那些 用于实现外键约束或可延迟的唯一性 和排除约束)。禁用或启用内部生成 约束触发器需要超级用户权限;应该做 谨慎,因为当然约束的完整性不能 保证如果触发器没有被执行。触发触发 机制也受配置变量的影响 session_replication_role。简单启用的触发器将在 复制角色是“origin”(默认)或“local”。触发器 配置为 ENABLE REPLICA 只会在会话处于 “副本”模式,配置为 ENABLE ALWAYS 的触发器将触发 无论当前的复制模式如何。

【问题讨论】:

  • 既然文档根本没有提到索引,为什么你认为它支持你应该禁用索引的想法?
  • 唯一确定的方法是测试它。我的猜测 - 禁用触发器不会禁用索引。
  • 我测试了一下,发现禁用触发器并没有禁用索引,说明还是使用了索引。

标签: postgresql


【解决方案1】:

禁用触发器不会禁用索引(为什么会这样?)。

至于计划

SELECT "users".* FROM "users"  WHERE "users"."id" = 1;

它可能会或可能不会使用基于许多因素的索引。主要是——表中的记录数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 2021-12-03
    • 1970-01-01
    • 2020-07-30
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多