Diff comments:

> 
> === modified file 'lib/lp/registry/model/distroseries.py'
> --- lib/lp/registry/model/distroseries.py     2019-02-13 14:39:18 +0000
> +++ lib/lp/registry/model/distroseries.py     2019-04-16 11:18:04 +0000
> @@ -1110,7 +1110,9 @@
>              SourcePackagePublishingHistory.pocket == pocket,
>              SourcePackagePublishingHistory.component == component,
>              SourcePackagePublishingHistory.status ==
> -                PackagePublishingStatus.PUBLISHED)
> +                PackagePublishingStatus.PUBLISHED,
> +            SourcePackagePublishingHistory.sourcepackagename ==
> +                SourcePackageName.id).order_by(SourcePackageName.name)

I had a look on dogfood, picking bionic/RELEASE/universe(/amd64) on the grounds 
that it's a good-sized test case.  Before this change:

launchpad_dogfood=# EXPLAIN (ANALYZE, BUFFERS) SELECT spph.* FROM 
sourcepackagepublishinghistory spph WHERE spph.archive = 1 AND 
spph.distroseries = 307 AND spph.pocket = 0 AND spph.component = 3 AND 
spph.status = 2;                                                                
                                         QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on sourcepackagepublishinghistory spph  
(cost=204.46..23889.15 rows=6852 width=129) (actual time=4.354..19.536 
rows=26217 loops=1)
   Recheck Cond: ((archive = 1) AND (distroseries = 307) AND (component = 3) 
AND (status = ANY ('{1,2}'::integer[])))
   Filter: ((pocket = 0) AND (status = 2))
   Rows Removed by Filter: 315
   Heap Blocks: exact=6257
   Buffers: shared hit=6361
   ->  Bitmap Index Scan on 
sourcepackagepublishinghistory__archive__distroseries__componen  
(cost=0.00..202.74 rows=7225 width=0) (actual time=3.126..3.126 rows=26532 
loops=1)
         Index Cond: ((archive = 1) AND (distroseries = 307) AND (component = 
3))
         Buffers: shared hit=104
 Planning time: 0.268 ms
 Execution time: 21.017 ms
(11 rows)

launchpad_dogfood=# EXPLAIN (ANALYZE, BUFFERS) SELECT bpph.* FROM 
binarypackagepublishinghistory bpph, distroarchseries das WHERE 
das.distroseries = 307 AND das.architecturetag = 'amd64' AND bpph.archive = 1 
AND bpph.distroarchseries = das.id AND bpph.pocket = 0 AND bpph.component = 3 
AND bpph.status = 2;
                                                                                
        QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=434.18..58179.31 rows=2612 width=118) (actual 
time=14.935..81.745 rows=68463 loops=1)
   Buffers: shared hit=18066
   ->  Seq Scan on distroarchseries das  (cost=0.00..4.79 rows=1 width=4) 
(actual time=0.016..0.032 rows=1 loops=1)
         Filter: ((distroseries = 307) AND (architecturetag = 'amd64'::text))
         Rows Removed by Filter: 185
         Buffers: shared hit=2
   ->  Bitmap Heap Scan on binarypackagepublishinghistory bpph  
(cost=434.18..58148.12 rows=2640 width=118) (actual time=14.915..63.144 
rows=68463 loops=1)
         Recheck Cond: ((archive = 1) AND (distroarchseries = das.id) AND 
(status = 2))
         Filter: ((pocket = 0) AND (component = 3))
         Rows Removed by Filter: 27136
         Heap Blocks: exact=17694
         Buffers: shared hit=18064
         ->  Bitmap Index Scan on 
binarypackagepublishinghistory__archive__distroarchseries__stat  
(cost=0.00..433.52 rows=15436 width=0) (actual time=11.432..11.432 rows=95599 
loops=1)
               Index Cond: ((archive = 1) AND (distroarchseries = das.id) AND 
(status = 2))
               Buffers: shared hit=370
 Planning time: 0.487 ms
 Execution time: 85.565 ms
(17 rows)

After this change:

launchpad_dogfood=# EXPLAIN (ANALYZE, BUFFERS) SELECT spph.* FROM 
sourcepackagepublishinghistory spph, sourcepackagename spn WHERE spph.archive = 
1 AND spph.distroseries = 307 AND spph.pocket = 0 AND spph.component = 3 AND 
spph.status = 2 AND spph.sourcepackagename = spn.id ORDER BY spn.name;
                                                                                
            QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Gather Merge  (cost=27373.26..28039.48 rows=5710 width=144) (actual 
time=62.870..87.535 rows=26217 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   Buffers: shared hit=85114
   ->  Sort  (cost=26373.24..26380.38 rows=2855 width=144) (actual 
time=58.580..59.476 rows=8739 loops=3)
         Sort Key: spn.name
         Sort Method: quicksort  Memory: 1734kB
         Buffers: shared hit=85114
         ->  Nested Loop  (cost=204.75..26209.37 rows=2855 width=144) (actual 
time=4.564..43.886 rows=8739 loops=3)
               Buffers: shared hit=85098
               ->  Parallel Bitmap Heap Scan on sourcepackagepublishinghistory 
spph  (cost=204.46..23794.32 rows=2855 width=129) (actual time=4.532..15.251 
rows=8739 loops=3)
                     Recheck Cond: ((archive = 1) AND (distroseries = 307) AND 
(component = 3) AND (status = ANY ('{1,2}'::integer[])))
                     Filter: ((pocket = 0) AND (status = 2))
                     Rows Removed by Filter: 105
                     Heap Blocks: exact=2530
                     Buffers: shared hit=6361
                     ->  Bitmap Index Scan on 
sourcepackagepublishinghistory__archive__distroseries__componen  
(cost=0.00..202.74 rows=7225 width=0) (actual time=6.233..6.233 rows=26532 
loops=1)
                           Index Cond: ((archive = 1) AND (distroseries = 307) 
AND (component = 3))
                           Buffers: shared hit=104
               ->  Index Scan using sourcepackagename_pkey on sourcepackagename 
spn  (cost=0.29..0.85 rows=1 width=19) (actual time=0.002..0.002 rows=1 
loops=26217)
                     Index Cond: (id = spph.sourcepackagename)
                     Buffers: shared hit=78737
 Planning time: 0.609 ms
 Execution time: 90.405 ms
(24 rows)

launchpad_dogfood=# EXPLAIN (ANALYZE, BUFFERS) SELECT bpph.* FROM 
binarypackagepublishinghistory bpph, distroarchseries das, binarypackagename 
bpn WHERE das.distroseries = 307 AND das.architecturetag = 'amd64' AND 
bpph.archive = 1 AND bpph.distroarchseries = das.id AND bpph.pocket = 0 AND 
bpph.component = 3 AND bpph.status = 2 AND bpph.binarypackagename = bpn.id 
ORDER BY bpn.name;
                                                                                
              QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=77529.14..77535.67 rows=2612 width=149) (actual 
time=504.820..524.463 rows=68463 loops=1)
   Sort Key: bpn.name
   Sort Method: external merge  Disk: 6464kB
   Buffers: shared hit=292084, temp read=808 written=809
   ->  Nested Loop  (cost=434.60..77380.90 rows=2612 width=149) (actual 
time=13.849..336.809 rows=68463 loops=1)
         Buffers: shared hit=292084
         ->  Nested Loop  (cost=434.18..58179.31 rows=2612 width=118) (actual 
time=13.836..94.612 rows=68463 loops=1)
               Buffers: shared hit=18066
               ->  Seq Scan on distroarchseries das  (cost=0.00..4.79 rows=1 
width=4) (actual time=0.016..0.032 rows=1 loops=1)
                     Filter: ((distroseries = 307) AND (architecturetag = 
'amd64'::text))
                     Rows Removed by Filter: 185
                     Buffers: shared hit=2
               ->  Bitmap Heap Scan on binarypackagepublishinghistory bpph  
(cost=434.18..58148.12 rows=2640 width=118) (actual time=13.816..73.712 
rows=68463 loops=1)
                     Recheck Cond: ((archive = 1) AND (distroarchseries = 
das.id) AND (status = 2))
                     Filter: ((pocket = 0) AND (component = 3))
                     Rows Removed by Filter: 27136
                     Heap Blocks: exact=17694
                     Buffers: shared hit=18064
                     ->  Bitmap Index Scan on 
binarypackagepublishinghistory__archive__distroarchseries__stat  
(cost=0.00..433.52 rows=15436 width=0) (actual time=10.492..10.492 rows=95599 
loops=1)
                           Index Cond: ((archive = 1) AND (distroarchseries = 
das.id) AND (status = 2))
                           Buffers: shared hit=370
         ->  Index Scan using binarypackagename_pkey on binarypackagename bpn  
(cost=0.42..7.35 rows=1 width=35) (actual time=0.003..0.003 rows=1 loops=68463)
               Index Cond: (id = bpph.binarypackagename)
               Buffers: shared hit=274018
 Planning time: 0.811 ms
 Execution time: 541.687 ms
(26 rows)

So in both cases this seems to be as I'd expected: the core of the plan remains 
the same, but an index scan of the xPN is appended and the combination is 
wrapped in a sort.  The binary version slows down more than the source version, 
but I think that's just the result of having to combine and sort ~68000 rows 
rather than ~26000 and tipping over the threshold where PostgreSQL picks an 
external merge sort; production has a higher work_mem than dogfood so it should 
be faster than that.

>  
>          def eager_load(spphs):
>              # Preload everything which will be used by archivepublisher's


-- 
https://code.launchpad.net/~cjwatson/launchpad/fix-ordering/+merge/366102
Your team Launchpad code reviewers is subscribed to branch lp:launchpad.

_______________________________________________
Mailing list: https://launchpad.net/~launchpad-reviewers
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~launchpad-reviewers
More help   : https://help.launchpad.net/ListHelp

Reply via email to