0

PostgreSQL 9.2。次のテーブルには、2 つのバリエーションのレコードを格納できます。alarmConfigurationsNOT NULL のエントリac_p_idは複数回存在できますが、NULL のエントリは 1ac_p_id回だけ存在する必要があります (したがって、ac_unique_row_no_port制約があります)。

ご覧のとおり、通常のインデックスは他のすべての外部キーに作成され、これらは頻繁にスキャンされます。しかし、ac_p_id...

  1. ac_index_p_idIS NOT NULL を使用して一意ではない制約を作成することに特に利点はありますか(他のように指定しないのではなく)?
  2. 実際、私が作成した場合、それは NOT NULLac_unique_row_no_portのスキャンにも使用されますか?ac_p_id

前もって感謝します。

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;
4

1 に答える 1

1

IS NOT NULL を使用して一意ではない制約 ac_index_p_id を作成することに特に利点はありますか (他のように指定しないのではなく)?

where ac_p_id is null or ac_p_id = ?個人的には、任意の式またはその他の複雑な式を使用してクエリを実行する場合に備えて、where 句を除外します。

実際、ac_unique_row_no_port のみを作成すると、ac_p_id が NULL でないスキャンにも使用されますか?

ac_p_id is nullいいえ。句で明示的に指定した場合にのみ使用されます。インデックスで使用される句全体whereが、考慮されるクエリ内にある必要があります。(PG が扱うマイナーな書き直しを行ったり受けたりしますが、テストせずにそれらを当てにしないでください。)

于 2013-09-11T15:12:05.407 に答える