У меня есть таблица, разделенная на два столбца, expired
и type_id
.
expired
- логическое и type_id
разбиение по диапазону.
Примеры таблиц:
mos_active_1
...
mos_active_15
mos_expired_1
...
mos_expired_15
Мои ограничения настроены так:
ADD CONSTRAINT mos_active_1_check CHECK (expired = false AND type_id < 100 )
...
ADD CONSTRAINT mos_expired_1_check CHECK (expired = true AND type_id < 100 )
Если я сейчас запускаю SELECT * from mos WHERE expired = true AND type_id = 34
, все работает как ожидалось, просто mos_expired_1
ударил.
Result (cost=0.00..19.77 rows=2 width=627)
-> Append (cost=0.00..19.77 rows=2 width=627)
-> Seq Scan on mos (cost=0.00..11.50 rows=1 width=627)
Filter: (expired AND (type_id = 34))
-> Index Scan using index_mos_expired_1_on_type_id_and_region_id on mos_expired_1 mos (cost=0.00..8.27 rows=1 width=627)
Index Cond: (type_id = 34)
Filter: expired
Удивительно достаточно SELECT * from mos WHERE expired = false AND type_id = 34
не не работает. EXPLAIN
показывает, что оба mos_expired_1
и mos_active_1
запрашиваются.
Result (cost=0.00..2464.71 rows=5863 width=150)
-> Append (cost=0.00..2464.71 rows=5863 width=150)
-> Seq Scan on mos (cost=0.00..11.50 rows=1 width=627)
Filter: ((NOT expired) AND (type_id = 34))
-> Index Scan using index_mos_expired_1_on_type_id_and_region_id on mos_expired_1 mos (cost=0.00..8.27 rows=1 width=627)
Index Cond: (type_id = 34)
Filter: (NOT expired)
-> Bitmap Heap Scan on mos_active_1 mos (cost=113.68..2444.95 rows=5861 width=150)
Recheck Cond: (type_id = 34)
Filter: (NOT expired)
-> Bitmap Index Scan on index_mos_active_1_on_type_id (cost=0.00..112.22 rows=5861 width=0)
Index Cond: (type_id = 34)
полный SQL (помимо фактического создания таблицы mos)
Мне бы очень хотелось узнать, что я что-то упустил или это проблема планировщика запросов.
ОБНОВЛЕНИЕ: Мне удалось воспроизвести ту же проблему на гораздо более простом примере, всего две таблицы с одним ограничением на основе срока действия:
CREATE TABLE mos (type_id INTEGER UNIQUE, expired boolean);
CREATE TABLE mos_expired_1 ( CHECK ( expired = true ) ) INHERITS (mos);
CREATE TABLE mos_active_1 ( CHECK ( expired = false ) ) INHERITS (mos);
INSERT INTO mos_expired_1 (type_id,expired) VALUES(1, true);
INSERT INTO mos_active_1 (type_id,expired) VALUES(2, false);
EXPLAIN SELECT * from mos where expired = false;
EXPLAIN SELECT * from mos where expired = true;