【问题标题】:PostgreSQL NULLable foreign key index optimizationPostgreSQL 可空外键索引优化
【发布时间】:2013-09-11 13:53:27
【问题描述】:

PostgreSQL 9.2。下表中可以存储两种不同的记录。 alarmConfigurations 条目其中ac_p_id 不为NULL 可以存在多次,但那些ac_p_id 为NULL 的条目只能存在一次(因此ac_unique_row_no_port 约束)。

如您所见,常规索引是在所有其他外键上创建的,这些外键会被大量扫描。但是对于ac_p_id...

  1. 使用 IS NOT NULL 创建非唯一约束 ac_index_p_id 是否有任何特别的优势(而不是像其他约束一样不指定)?
  2. 事实上,如果我只创建ac_unique_row_no_port,它是否也可以用于ac_p_id 不为NULL 的扫描?

提前致谢。

CREATE TABLE alarmConfigurations (
  ac_id SERIAL PRIMARY KEY,
  ac_ad_code TEXT NOT NULL,
  ac_ad_et_code TEXT NOT NULL,
  ac_e_id INTEGER NOT NULL,
  ac_as_code TEXT,
  ac_p_id INTEGER,
  ac_details HSTORE,          -- extra configuration
  CONSTRAINT ac_ad_fkey FOREIGN KEY (ac_ad_code, ac_ad_et_code)
    REFERENCES alarmDefinitions (ad_code, ad_et_code)
    ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT ac_as_code_fkey FOREIGN KEY (ac_as_code)
    REFERENCES alarmSeverities (as_code)
    ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT ac_e_id_fkey FOREIGN KEY (ac_e_id)
    REFERENCES entities (e_id) ON DELETE CASCADE,
  CONSTRAINT ac_p_id_fkey FOREIGN KEY (ac_p_id)
    REFERENCES ports (p_id) ON DELETE CASCADE
);
CREATE INDEX ac_index_e_id ON alarmConfigurations(ac_e_id);
CREATE INDEX ac_index_ad_code ON alarmConfigurations(ac_ad_code);
CREATE INDEX ac_index_ad_et_code ON alarmConfigurations(ac_ad_et_code);
CREATE INDEX ac_index_p_id ON alarmConfigurations(ac_p_id)
  WHERE ac_p_id IS NOT NULL;
CREATE UNIQUE INDEX ac_unique_row_no_port
  ON alarmConfigurations(ac_ad_code, ac_ad_et_code, ac_e_id)
  WHERE ac_p_id IS NULL;

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    创建具有 IS NOT NULL 的非唯一约束 ac_index_p_id 有什么特别的优势(而不是像其他约束一样不指定)?

    就我个人而言,我会将 where 子句放在那个上面,以防您想使用任意的 where ac_p_id is null or ac_p_id = ? 或其他一些复杂的表达式运行查询。

    事实上,如果我只创建 ac_unique_row_no_port,那它是否也会用于 ac_p_id 不为 NULL 的扫描?

    没有。只有在子句中明确指定 ac_p_id is null 时才会使用它。索引中使用的整个where 子句必须在查询中才能考虑。 (给予或接受 PG 处理的轻微重写,但不要指望他们未经测试。)

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2011-02-27
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多