Why does it index scan when I use where, but not when I do a join?

On Fri, Dec 11, 2015 at 7:20 PM, Andreas Kretschmer <andr...@a-kretschmer.de
> wrote:

>
> > Rick Otten <rottenwindf...@gmail.com> hat am 11. Dezember 2015 um 23:09
> > geschrieben:
>
> >
> > The query performance hit for sequence scanning isn't all that terrible,
> > but I'd rather understand and get rid of the issue if I can, now, before
> I
> > run into it again in a situation where it is crippling.
>
> i think, you should try to understand how the planner works.
>
> a simple example:
>
> test=# create table foo (id serial primary key, val text);
> CREATE TABLE
> test=*# insert into foo (val) select repeat(md5(1::text), 5);
> INSERT 0 1
> test=*# analyse foo;
> ANALYZE
> test=*# explain analyse select val from foo where id=1;
>                                           QUERY PLAN
>
> -----------------------------------------------------------------------------------------------
>  Seq Scan on foo  (cost=0.00..1.02 rows=1 width=164) (actual
> time=0.006..0.007
> rows=1 loops=1)
>    Filter: (id = 1)
>    Rows Removed by Filter: 1
>  Planning time: 0.118 ms
>  Execution time: 0.021 ms
> (5 rows)
>
>
> As you can see a seq-scan. It's a small table, costs ..1.02.
>
> Adding one row:
>
> test=*# insert into foo (val) select val from foo;
> INSERT 0 1
> test=*# analyse foo;
> ANALYZE
> test=*# explain analyse select val from foo where id=1;
>                                           QUERY PLAN
>
> -----------------------------------------------------------------------------------------------
>  Seq Scan on foo  (cost=0.00..1.02 rows=1 width=164) (actual
> time=0.006..0.007
> rows=1 loops=1)
>    Filter: (id = 1)
>    Rows Removed by Filter: 1
>  Planning time: 0.118 ms
>  Execution time: 0.021 ms
> (5 rows)
>
>
> The same plan. Adding 2 rows:
>
> test=*# insert into foo (val) select val from foo;
> INSERT 0 2
> test=*# analyse foo;
> ANALYZE
> test=*# explain analyse select val from foo where id=1;
>                                           QUERY PLAN
>
> -----------------------------------------------------------------------------------------------
>  Seq Scan on foo  (cost=0.00..1.05 rows=1 width=164) (actual
> time=0.220..0.277
> rows=1 loops=1)
>    Filter: (id = 1)
>    Rows Removed by Filter: 3
>  Planning time: 0.149 ms
>  Execution time: 0.453 ms
> (5 rows)
>
>
> The same plan. Adding more rows:
>
> test=*# insert into foo (val) select val from foo;
> INSERT 0 4
> test=*# insert into foo (val) select val from foo;
> INSERT 0 8
> test=*# insert into foo (val) select val from foo;
> INSERT 0 16
> test=*# insert into foo (val) select val from foo;
> INSERT 0 32
> test=*# insert into foo (val) select val from foo;
> INSERT 0 64
> test=*# insert into foo (val) select val from foo;
> INSERT 0 128
> test=*# insert into foo (val) select val from foo;
> INSERT 0 256
> test=*# insert into foo (val) select val from foo;
> INSERT 0 512
> test=*# insert into foo (val) select val from foo;
> INSERT 0 1024
> test=*# insert into foo (val) select val from foo;
> INSERT 0 2048
> test=*# insert into foo (val) select val from foo;
> INSERT 0 4096
> test=*# analyse foo;
> ANALYZE
> test=*# explain analyse select val from foo where id=1;
>                                                    QUERY PLAN
>
> ----------------------------------------------------------------------------------------------------------------
>  Index Scan using foo_pkey on foo  (cost=0.28..8.30 rows=1 width=164)
> (actual
> time=0.007..0.008 rows=1 loops=1)
>    Index Cond: (id = 1)
>  Planning time: 0.120 ms
>  Execution time: 0.024 ms
> (4 rows)
>
>
> We got a new plan! Index-Scan now. We are looking now in pg_class to see
> how
> many rows and pages we have:
>
> test=*# select relpages, reltuples from pg_class where relname = 'foo';
>  relpages | reltuples
> ----------+-----------
>       200 |      8192
> (1 row)
>
> How large ist the Index?
>
> test=*# select relpages, reltuples from pg_class where relname =
> 'foo_pkey';
>  relpages | reltuples
> ----------+-----------
>        25 |      8192
> (1 row)
>
>
>
> So, now it's cheaper to read the index and than do an index-scan on the
> heap to
> read one record (our where-condition is on the primary key, so only one row
> expected, one page have to read with random access)
>
>
>
> It's simple math! If you want to learn more you can find a lot about that
> via
> google:
>
> https://www.google.de/?gws_rd=ssl#q=explaining+explain
>

Reply via email to