a)在上创建一个简单(而非部分)索引(is_active, measurement_id)
。将在部分索引将用于的查询中使用。当然,如果is_active
列的True为3%,False为97%,则该索引将比部分索引大得多。但是仍然小于表,对于这些查询很有用。
另一个限制是UNIQUE
该解决方案不能使用索引,因此不会强制执行约束。如果使用创建索引,则具有UNIQUE
的行也将强制唯一性is_active = FALSE
。我假设您不想要这样:
CREATE INDEX dir_events
ON events (is_active, measurement_id)
USING btree ;
b1)(b的简单变体):在设计中添加另一个表,仅包含的主键列events
和的外键events
。该表仅应包含is_active
原始表中为true的行(这将由您的应用程序/过程强制执行)。使用的查询is_active = TRUE
将被更改为联接到该表(而不是WHERE
条件)
。UNIQUE
此解决方案都不强制使用,但是查询只会进行简单的联接(到更小的索引),并且应该非常有效:
CREATE TABLE events_active
( event_id INT NOT NULL, -- assuming an INT primary key on events
PRIMARY KEY (event_id),
FOREIGN KEY (event_id)
REFERENCES events (event_id)
) ;
INSERT INTO events_active
(event_id)
SELECT event_id
FROM events
WHERE is_active = TRUE ;
b2)一个更复杂的解决方案:在您的设计中添加另一个表,其中仅包含表和measurement_id
的主键列。与之前的建议一样,此表应仅包含is_active
原始表中true的行(这也将由您的应用程序/过程强制执行)。然后,仅将此表用于具有WHERE is_active = TRUE
且仅需要该measurement_id
列的查询。如果从需要更多的列events
,你必须join
像以前一样。
该UNIQUE
约束可以使用此解决方案来执行。measurement_id
列的重复也可以确保一致(带有一个额外的唯一约束events
和一个复合外键):
ALTER TABLE events
ADD UNIQUE (event_id, measurement_id) ;
CREATE TABLE events_active
( event_id INT NOT NULL,
measurement_id INT NOT NULL.
PRIMARY KEY (event_id, measurement_id),
UNIQUE (measurement_id),
FOREIGN KEY (event_id, measurement_id)
REFERENCES events (event_id, measurement_id)
) ;
INSERT INTO events_active
(event_id, measurement_id)
SELECT event_id, measurement_id
FROM events
WHERE is_active = TRUE ;
c)也许是最简单的:使用PostgreSQL。我确定有适合您Linux发行版的软件包。它们可能不是Postgres的最新版本,但是在7.0(或更早的版本)中添加了部分索引,因此您应该不会有问题。另外,我相信您可以在几乎所有Linux发行版中安装最新版本-即使有一点麻烦。您只需要安装一次。
is_active = TRUE
(或只有一个列,即的PKdir_events
)。