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 -- Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-performance