Здравствуйте.
Возможно ли? Находил на различных форумах информацию, что не получиться, что операции с timestamptz всегда stable. Так ли это? И если не должно работать, то почему у меня вроде бы работает?
Базовая таблица и производные от нее:
CREATE TABLE part_test ( id integer NOT NULL, time_value timestamp WITH time zone NOT NULL ) CREATE TABLE part_test_y2012m01 ( CONSTRAINT part_test_y2012m01_pkey PRIMARY KEY (id , time_value ), CONSTRAINT part_test_y2012m01_time_value_check CHECK (time_value >= '2012-01-01 00:00:00+00'::timestamp WITH time zone AND time_value < '2012-02-01 00:00:00+00'::timestamp WITH time zone) ) INHERITS (part_test) CREATE TABLE part_test_y2012m02 ( CONSTRAINT part_test_y2012m02_pkey PRIMARY KEY (id , time_value ), CONSTRAINT part_test_y2012m02_time_value_check CHECK (time_value >= '2012-02-01 00:00:00+00'::timestamp WITH time zone AND time_value < '2012-03-01 00:00:00+00'::timestamp WITH time zone) ) INHERITS (part_test)
Базовая таблица всегда пустая (там return null; у нее в триггере before insert). В производных таблицах по 5 записей (для теста).
Запрос и результат:
EXPLAIN analyze SELECT * FROM part_test AS pt WHERE pt.time_value >= '2012-01-01 17:00:00+06' AND pt.time_value <= '2012-01-04 20:00:00+06'
QUERY PLAN Result (cost=0.00..77.33 rows=20 width=12) (actual time=0.041..0.044 rows=4 loops=1) -> Append (cost=0.00..77.33 rows=20 width=12) (actual time=0.038..0.039 rows=4 loops=1) -> Seq Scan ON part_test pt (cost=0.00..39.10 rows=10 width=12) (actual time=0.012..0.012 rows=0 loops=1) Filter: ((time_value >= '2012-01-01 11:00:00+00'::timestamp WITH time zone) AND (time_value <= '2012-01-04 14:00:00+00'::timestamp WITH time zone)) -> Bitmap Heap Scan ON part_test_y2012m01 pt (cost=27.65..38.23 rows=10 width=12) (actual time=0.023..0.024 rows=4 loops=1) Recheck Cond: ((time_value >= '2012-01-01 11:00:00+00'::timestamp WITH time zone) AND (time_value <= '2012-01-04 14:00:00+00'::timestamp WITH time zone)) -> Bitmap INDEX Scan ON part_test_y2012m01_pkey (cost=0.00..27.65 rows=10 width=0) (actual time=0.017..0.017 rows=4 loops=1) INDEX Cond: ((time_value >= '2012-01-01 11:00:00+00'::timestamp WITH time zone) AND (time_value <= '2012-01-04 14:00:00+00'::timestamp WITH time zone)) Total runtime: 0.144 ms
Как видно, обращения получились только к одной из производных таблиц.
В чем я ошибаюсь? Ведь вроде бы все работает, или это не так?
(timezone на сервере: UTC)
----------------------------------------
Ответ получен.
http://www.sql.ru/forum/actualthread.aspx?tid=922686