PostgreSQL 9.2。记录的两种变体可以存储在下表中。 alarmConfigurations
为NOT NULL的ac_p_id
条目可以存在多次,但ac_p_id
为NULL的条目只能存在一次(因此ac_unique_row_no_port
约束)。
如您所见,在所有其他外键上创建常规索引,这些索引会被扫描很多。但对于ac_p_id
......
ac_index_p_id
是否有任何特别的优势(与未指定其他约束相反)?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;
答案 0 :(得分: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为NOT NULL的扫描吗?
没有。只有在您的子句中明确指定ac_p_id is null
时才会使用它。索引中使用的整个where
子句必须在查询中,以便考虑它。 (给予或接受PG处理的次要重写,但不经测试就不依赖它们。)