index definition
CREATE INDEX views_visit_id_visit_buoy_index ON views USING btree
(visit_id, visit_buoy)



On Tue, Jan 29, 2013 at 1:35 PM, Merlin Moncure <mmonc...@gmail.com> wrote:

> On Tue, Jan 29, 2013 at 12:59 PM, Alex Vinnik <alvinni...@gmail.com>
> wrote:
> >
> >
> >
> > On Tue, Jan 29, 2013 at 11:39 AM, Ben Chobot <be...@silentmedia.com>
> wrote:
> >>
> >> On Jan 29, 2013, at 6:24 AM, Alex Vinnik wrote:
> >>
> >>> random_page_cost=1 might be not what you really want.
> >>> it would mean that random reads are as fast as as sequential reads,
> which
> >>> probably is true only for SSD
> >>
> >> What randon_page_cost would be more appropriate for EC2 EBS Provisioned
> >> volume that can handle 2,000 IOPS?
> >>
> >>
> >> For EC2 Provisioned IOPS volumes - not standard EBS - random_page_cost=1
> >> is exactly what you want.
> >>
> > Well... after some experimentation it turned out that
> random_page_cost=0.6
> > gives me fast query
> >
> > QUERY PLAN
> > Sort  (cost=754114.96..754510.46 rows=158199 width=8) (actual
> > time=1839.324..2035.405 rows=209401 loops=1)
> >   Sort Key: visits.id, views.id
> >   Sort Method: quicksort  Memory: 15960kB
> >   ->  Nested Loop  (cost=0.00..740453.38 rows=158199 width=8) (actual
> > time=0.048..1531.592 rows=209401 loops=1)
> >         ->  Index Scan using visits_created_at_index on visits
> > (cost=0.00..5929.82 rows=115492 width=4) (actual time=0.032..161.488
> > rows=131311 loops=1)
> >               Index Cond: ((created_at >= '2013-01-15
> 00:00:00'::timestamp
> > without time zone) AND (created_at < '2013-01-16 00:00:00'::timestamp
> > without time zone))
> >         ->  Index Scan using views_visit_id_index on views
>  (cost=0.00..6.26
> > rows=10 width=8) (actual time=0.003..0.005 rows=2 loops=131311)
> >               Index Cond: (visit_id = visits.id)
> > Total runtime: 2234.142 ms
> >
> > random_page_cost=0.7 slows it down 16 times
> >
> > Sort  (cost=804548.42..804943.92 rows=158199 width=8) (actual
> > time=37011.337..37205.449 rows=209401 loops=1)
> >   Sort Key: visits.id, views.id
> >   Sort Method: quicksort  Memory: 15960kB
> >   ->  Merge Join  (cost=15871.37..790886.85 rows=158199 width=8) (actual
> > time=35673.602..36714.056 rows=209401 loops=1)
> >         Merge Cond: (visits.id = views.visit_id)
> >         ->  Sort  (cost=15824.44..16113.17 rows=115492 width=4) (actual
> > time=335.486..463.085 rows=131311 loops=1)
> >               Sort Key: visits.id
> >               Sort Method: quicksort  Memory: 12300kB
> >               ->  Index Scan using visits_created_at_index on visits
> > (cost=0.00..6113.04 rows=115492 width=4) (actual time=0.034..159.326
> > rows=131311 loops=1)
> >                     Index Cond: ((created_at >= '2013-01-15
> > 00:00:00'::timestamp without time zone) AND (created_at < '2013-01-16
> > 00:00:00'::timestamp without time zone))
>
> >         ->  Index Scan using views_visit_id_visit_buoy_index on views
> > (cost=0.00..757596.22 rows=6122770 width=8) (actual time=0.017..30765.316
> > rows=5145902 loops=1)
>
> Something is awry here. pg is doing an index scan via
> views_visit_id_visit_buoy_index with no matching condition.  What's
> the definition of that index? The reason why the random_page_cost
> adjustment is working is that you are highly penalizing sequential
> type scans so that the database is avoiding the merge (sort A, sort B,
> stepwise compare).
>
> SQL server is doing a nestloop/index scan, just like the faster pg
> plan, but is a bit faster because it's parallelizing.
>
>  merlin
>

Reply via email to