a)に単純な(部分的ではない)インデックスを作成し(is_active, measurement_id)
ます。部分インデックスを使用するクエリで使用されます。もちろん、is_active
列が3%Trueで97%Falseの場合、このインデックスは(部分インデックスより)大きくなります。しかし、それでもテーブルより小さく、これらのクエリに役立ちます。
もう1つの制限は、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
(または列が1つしかない、PK ofが1つしかない)別のテーブルをデザインに追加できますdir_events
。