Skip to main content
added [postgresql-performance] to 571 questions - Shog9 (Id=1924)
Link
Tweeted twitter.com/StackDBAs/status/650296486111117313
Rollback to Revision 2
Source Link
Erwin Brandstetter
  • 182.2k
  • 28
  • 457
  • 620

edit:

My postgres version: postgres (PostgreSQL) 9.0.12

After Erwins' comment I tried and it works fine. However I see another problem;

I use it with collumn which named coll;

CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(32),
    ts timestamp without time zone
);
CREATE INDEX ON test2(ts);

CREATE TABLE test2_20150812 (
    CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);

CREATE TABLE test2_20150811 (
    CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);

CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);

EXPLAIN select * from test2 WHERE ts >= '2015-08-11' ORDER BY ts DESC;

output is;

Sort  (cost=76.86..78.64 rows=715 width=46)
   Sort Key: public.test2.ts
   ->  Result  (cost=0.00..42.96 rows=715 width=46)
         ->  Append  (cost=0.00..42.96 rows=715 width=46)
               ->  Seq Scan on test2  (cost=0.00..0.00 rows=1 width=46)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Bitmap Heap Scan on test2_20150812 test2  (cost=7.02..21.48 rows=357 width=46)
                     Recheck Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
                     ->  Bitmap Index Scan on test2_20150812_ts_idx  (cost=0.00..6.93 rows=357 width=0)
                           Index Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Bitmap Heap Scan on test2_20150811 test2  (cost=7.02..21.48 rows=357 width=46)
                     Recheck Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
                     ->  Bitmap Index Scan on test2_20150811_ts_idx  (cost=0.00..6.93 rows=357 width=0)
                           Index Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)

However if I change column coll and do these steps again;

CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(255),
    ts timestamp without time zone
);

Explain output is;

 Sort  (cost=42.47..43.18 rows=287 width=157)
   Sort Key: public.test2.ts
   ->  Result  (cost=0.00..30.75 rows=287 width=157)
         ->  Append  (cost=0.00..30.75 rows=287 width=157)
               ->  Seq Scan on test2  (cost=0.00..0.00 rows=1 width=157)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Seq Scan on test2_20150812 test2  (cost=0.00..15.38 rows=143 width=157)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Seq Scan on test2_20150811 test2  (cost=0.00..15.38 rows=143 width=157)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)

I dont understand why postgresql do that. Is there any way for using childs' index with column?

edit:

My postgres version: postgres (PostgreSQL) 9.0.12

After Erwins' comment I tried and it works fine. However I see another problem;

I use it with collumn which named coll;

CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(32),
    ts timestamp without time zone
);
CREATE INDEX ON test2(ts);

CREATE TABLE test2_20150812 (
    CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);

CREATE TABLE test2_20150811 (
    CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);

CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);

EXPLAIN select * from test2 WHERE ts >= '2015-08-11' ORDER BY ts DESC;

output is;

Sort  (cost=76.86..78.64 rows=715 width=46)
   Sort Key: public.test2.ts
   ->  Result  (cost=0.00..42.96 rows=715 width=46)
         ->  Append  (cost=0.00..42.96 rows=715 width=46)
               ->  Seq Scan on test2  (cost=0.00..0.00 rows=1 width=46)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Bitmap Heap Scan on test2_20150812 test2  (cost=7.02..21.48 rows=357 width=46)
                     Recheck Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
                     ->  Bitmap Index Scan on test2_20150812_ts_idx  (cost=0.00..6.93 rows=357 width=0)
                           Index Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Bitmap Heap Scan on test2_20150811 test2  (cost=7.02..21.48 rows=357 width=46)
                     Recheck Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
                     ->  Bitmap Index Scan on test2_20150811_ts_idx  (cost=0.00..6.93 rows=357 width=0)
                           Index Cond: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)

However if I change column coll and do these steps again;

CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(255),
    ts timestamp without time zone
);

Explain output is;

 Sort  (cost=42.47..43.18 rows=287 width=157)
   Sort Key: public.test2.ts
   ->  Result  (cost=0.00..30.75 rows=287 width=157)
         ->  Append  (cost=0.00..30.75 rows=287 width=157)
               ->  Seq Scan on test2  (cost=0.00..0.00 rows=1 width=157)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Seq Scan on test2_20150812 test2  (cost=0.00..15.38 rows=143 width=157)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)
               ->  Seq Scan on test2_20150811 test2  (cost=0.00..15.38 rows=143 width=157)
                     Filter: (ts >= '2015-08-11 00:00:00'::timestamp without time zone)

I dont understand why postgresql do that. Is there any way for using childs' index with column?

deleted 2 characters in body
Source Link
umut
  • 285
  • 3
  • 7
CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(32),
    ts timestamp without time zone
);
CREATE INDEX ON test2(datets);

CREATE TABLE test2_20150812 (
    CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);

CREATE TABLE test2_20150811 (
    CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);

CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);

EXPLAIN select * from test2 WHERE ts >= '2015-08-11' ORDER BY ts DESC;
CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(32),
    ts timestamp without time zone
);
CREATE INDEX ON test2(date);

CREATE TABLE test2_20150812 (
    CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);

CREATE TABLE test2_20150811 (
    CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);

CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);

EXPLAIN select * from test2 WHERE ts >= '2015-08-11' ORDER BY ts DESC;
CREATE TABLE test2 (
    id serial PRIMARY KEY,
    coll character varying(32),
    ts timestamp without time zone
);
CREATE INDEX ON test2(ts);

CREATE TABLE test2_20150812 (
    CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);

CREATE TABLE test2_20150811 (
    CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);

CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);

EXPLAIN select * from test2 WHERE ts >= '2015-08-11' ORDER BY ts DESC;
added 3139 characters in body
Source Link
umut
  • 285
  • 3
  • 7
Loading
untangle post, add tags, typos, format, clarify title
Source Link
Erwin Brandstetter
  • 182.2k
  • 28
  • 457
  • 620
Loading
Source Link
umut
  • 285
  • 3
  • 7
Loading