← Back to team overview

launchpad-reviewers team mailing list archive

Re: [Merge] lp:~cjwatson/launchpad/improve-bug-commenter-search into lp:launchpad

 

~cjwatson, old query for +commentedbugs with default options:

launchpad_staging=> EXPLAIN (ANALYZE, BUFFERS) SELECT BugTaskFlat.bugtask FROM BugTaskFlat LEFT JOIN Product ON BugTaskFlat.product = Product.id AND Product.active WHERE BugTaskFlat.status IN (25, 10, 20, 21, 22, 13, 14) AND BugTaskFlat.duplicateof IS NULL AND (BugTaskFlat.product IS NULL OR Product.active = true) AND BugTaskFlat.bug IN (SELECT BugMessage.bug FROM BugMessage WHERE BugMessage.index > 0 AND BugMessage.owner = 91) AND (BugTaskFlat.information_type IN (1, 2) OR COALESCE((BugTaskFlat.access_grants) && (SELECT ARRAY_AGG(TeamParticipation.team) FROM TeamParticipation WHERE TeamParticipation.person = 91), false) OR COALESCE((BugTaskFlat.access_policies) && (SELECT ARRAY_AGG(AccessPolicyGrant.policy) FROM AccessPolicyGrant JOIN TeamParticipation ON TeamParticipation.team = AccessPolicyGrant.grantee WHERE TeamParticipation.person = 91), false)) ORDER BY BugTaskFlat.importance DESC, BugTaskFlat.bugtask LIMIT 76 OFFSET 0;
                                                                                                                       QUERY PLAN                                                                     
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=1768.60..7050.15 rows=76 width=8) (actual time=12.241..594.731 rows=76 loops=1)
   Buffers: shared hit=122385
   InitPlan 1 (returns $0)
     ->  Aggregate  (cost=62.92..62.93 rows=1 width=32) (actual time=0.328..0.328 rows=1 loops=1)
           Buffers: shared hit=171
           ->  Index Scan using teamparticipation_person_idx on teamparticipation  (cost=0.43..62.18 rows=293 width=4) (actual time=0.022..0.255 rows=330 loops=1)
                 Index Cond: (person = 91)
                 Buffers: shared hit=171
   InitPlan 2 (returns $2)
     ->  Aggregate  (cost=1704.51..1704.52 rows=1 width=32) (actual time=11.016..11.016 rows=1 loops=1)
           Buffers: shared hit=5208
           ->  Nested Loop  (cost=0.85..1704.32 rows=75 width=4) (actual time=0.035..8.835 rows=13483 loops=1)
                 Buffers: shared hit=5208
                 ->  Index Scan using teamparticipation_person_idx on teamparticipation teamparticipation_1  (cost=0.43..62.18 rows=293 width=4) (actual time=0.014..0.167 rows=330 loops=1)
                       Index Cond: (person = 91)
                       Buffers: shared hit=171
                 ->  Index Only Scan using accesspolicygrant__grantee__policy__key on accesspolicygrant  (cost=0.42..5.56 rows=4 width=8) (actual time=0.003..0.021 rows=41 loops=330)
                       Index Cond: (grantee = teamparticipation_1.team)
                       Heap Fetches: 13483
                       Buffers: shared hit=5037
   ->  Nested Loop Left Join  (cost=1.16..1079174.95 rows=15529 width=8) (actual time=12.240..594.708 rows=76 loops=1)
         Filter: ((bugtaskflat.product IS NULL) OR product.active)
         Buffers: shared hit=122385
         ->  Nested Loop Semi Join  (cost=0.86..1073265.94 rows=17761 width=12) (actual time=12.237..594.513 rows=76 loops=1)
               Buffers: shared hit=122313
               ->  Index Scan Backward using bugtaskflat__importance__bugtask__idx on bugtaskflat  (cost=0.43..490403.01 rows=647482 width=16) (actual time=11.641..533.065 rows=4968 loops=1)
                     Filter: ((duplicateof IS NULL) AND ((information_type = ANY ('{1,2}'::integer[])) OR COALESCE((access_grants && $0), false) OR COALESCE((access_policies && $2), false)) AND (status = ANY ('{25,10,20,21,22,13,14}'::integer[])))
                     Rows Removed by Filter: 56834
                     Buffers: shared hit=66461
               ->  Index Scan using bugmessage__bug__index__key on bugmessage  (cost=0.43..0.90 rows=1 width=4) (actual time=0.012..0.012 rows=0 loops=4968)
                     Index Cond: ((bug = bugtaskflat.bug) AND (index > 0))
                     Filter: (owner = 91)
                     Rows Removed by Filter: 9
                     Buffers: shared hit=55852
         ->  Index Scan using product_pkey on product  (cost=0.29..0.32 rows=1 width=5) (actual time=0.002..0.002 rows=0 loops=76)
               Index Cond: (bugtaskflat.product = id)
               Filter: active
               Buffers: shared hit=72
 Planning time: 14.577 ms
 Execution time: 594.892 ms
(40 rows)

~cjwatson, new query for +commentedbugs with default options:

launchpad_staging=> EXPLAIN (ANALYZE, BUFFERS) SELECT BugTaskFlat.bugtask FROM BugTaskFlat LEFT JOIN Product ON BugTaskFlat.product = Product.id AND Product.active WHERE BugTaskFlat.status IN (25, 10, 20, 21, 22, 13, 14) AND BugTaskFlat.duplicateof IS NULL AND (BugTaskFlat.product IS NULL OR Product.active = true) AND BugTaskFlat.bug IN (SELECT BugMessage.bug FROM BugMessage WHERE BugMessage.index > 0 AND BugMessage.owner = 91 UNION SELECT BugActivity.bug FROM BugActivity WHERE BugActivity.person = 91 AND (BugActivity.whatchanged != E'bug' OR BugActivity.message != E'added bug')) AND (BugTaskFlat.information_type IN (1, 2) OR COALESCE((BugTaskFlat.access_grants) && (SELECT ARRAY_AGG(TeamParticipation.team) FROM TeamParticipation WHERE TeamParticipation.person = 91), false) OR COALESCE((BugTaskFlat.access_policies) && (SELECT ARRAY_AGG(AccessPolicyGrant.policy) FROM AccessPolicyGrant JOIN TeamParticipation ON TeamParticipation.team = AccessPolicyGrant.grantee WHERE TeamParticipation.person = 91), false)) ORDER BY BugTaskFlat.importance DESC, BugTaskFlat.bugtask LIMIT 76 OFFSET 0;
                                                                                                                          QUERY PLAN                                                                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=327777.92..327778.11 rows=76 width=8) (actual time=420.475..420.493 rows=76 loops=1)
   Buffers: shared hit=157609
   InitPlan 1 (returns $0)
     ->  Aggregate  (cost=62.92..62.93 rows=1 width=32) (actual time=0.290..0.290 rows=1 loops=1)
           Buffers: shared hit=171
           ->  Index Scan using teamparticipation_person_idx on teamparticipation  (cost=0.43..62.18 rows=293 width=4) (actual time=0.013..0.222 rows=330 loops=1)
                 Index Cond: (person = 91)
                 Buffers: shared hit=171
   InitPlan 2 (returns $2)
     ->  Aggregate  (cost=1704.51..1704.52 rows=1 width=32) (actual time=10.802..10.802 rows=1 loops=1)
           Buffers: shared hit=5208
           ->  Nested Loop  (cost=0.85..1704.32 rows=75 width=4) (actual time=0.026..8.721 rows=13483 loops=1)
                 Buffers: shared hit=5208
                 ->  Index Scan using teamparticipation_person_idx on teamparticipation teamparticipation_1  (cost=0.43..62.18 rows=293 width=4) (actual time=0.010..0.158 rows=330 loops=1)
                       Index Cond: (person = 91)
                       Buffers: shared hit=171
                 ->  Index Only Scan using accesspolicygrant__grantee__policy__key on accesspolicygrant  (cost=0.42..5.56 rows=4 width=8) (actual time=0.003..0.020 rows=41 loops=330)
                       Index Cond: (grantee = teamparticipation_1.team)
                       Heap Fetches: 13483
                       Buffers: shared hit=5037
   ->  Sort  (cost=326010.48..326115.68 rows=42082 width=8) (actual time=420.474..420.479 rows=76 loops=1)
         Sort Key: bugtaskflat.importance DESC, bugtaskflat.bugtask
         Sort Method: top-N heapsort  Memory: 31kB
         Buffers: shared hit=157609
         ->  Hash Left Join  (cost=104139.99..324485.44 rows=42082 width=8) (actual time=215.728..419.078 rows=2882 loops=1)
               Hash Cond: (bugtaskflat.product = product.id)
               Filter: ((bugtaskflat.product IS NULL) OR product.active)
               Rows Removed by Filter: 5
               Buffers: shared hit=157609
               ->  Nested Loop  (cost=97696.16..317915.27 rows=48129 width=12) (actual time=175.376..377.052 rows=2887 loops=1)
                     Buffers: shared hit=152313
                     ->  HashAggregate  (cost=97695.73..98357.64 rows=66191 width=4) (actual time=175.300..183.677 rows=23123 loops=1)
                           Group Key: bugmessage.bug
                           Buffers: shared hit=43535
                           ->  Append  (cost=370.29..97530.25 rows=66191 width=4) (actual time=8.227..152.611 rows=77181 loops=1)
                                 Buffers: shared hit=43535
                                 ->  Bitmap Heap Scan on bugmessage  (cost=370.29..27803.69 rows=24318 width=4) (actual time=8.226..34.503 rows=26797 loops=1)
                                       Recheck Cond: ((owner = 91) AND (index > 0))
                                       Heap Blocks: exact=16026
                                       Buffers: shared hit=16102
                                       ->  Bitmap Index Scan on bugmessage__owner__index__idx  (cost=0.00..364.22 rows=24318 width=0) (actual time=5.221..5.221 rows=26797 loops=1)
                                             Index Cond: ((owner = 91) AND (index > 0))
                                             Buffers: shared hit=76
                                 ->  Bitmap Heap Scan on bugactivity  (cost=744.79..69064.65 rows=41873 width=4) (actual time=60.435..108.887 rows=50384 loops=1)
                                       Recheck Cond: (person = 91)
                                       Filter: ((whatchanged <> 'bug'::text) OR (message <> 'added bug'::text))
                                       Rows Removed by Filter: 1060
                                       Heap Blocks: exact=27231
                                       Buffers: shared hit=27433
                                       ->  Bitmap Index Scan on bugactivity_person_datechanged_idx  (cost=0.00..734.32 rows=50795 width=0) (actual time=54.802..54.802 rows=51444 loops=1)
                                             Index Cond: (person = 91)
                                             Buffers: shared hit=202
                     ->  Index Scan using bugtaskflat__bug__idx on bugtaskflat  (cost=0.43..3.30 rows=1 width=16) (actual time=0.008..0.008 rows=0 loops=23123)
                           Index Cond: (bug = bugmessage.bug)
                           Filter: ((duplicateof IS NULL) AND ((information_type = ANY ('{1,2}'::integer[])) OR COALESCE((access_grants && $0), false) OR COALESCE((access_policies && $2), false)) AND (status = ANY ('{25,10,20,21,22,13,14}'::integer[])))
                           Rows Removed by Filter: 1
                           Buffers: shared hit=108778
               ->  Hash  (cost=5907.98..5907.98 rows=42868 width=5) (actual time=40.277..40.277 rows=42868 loops=1)
                     Buckets: 65536  Batches: 1  Memory Usage: 2061kB
                     Buffers: shared hit=5296
                     ->  Seq Scan on product  (cost=0.00..5907.98 rows=42868 width=5) (actual time=0.011..30.002 rows=42868 loops=1)
                           Filter: active
                           Rows Removed by Filter: 18330
                           Buffers: shared hit=5296
 Planning time: 8.906 ms
 Execution time: 421.888 ms
(66 rows)

~willamsusa (spammer), old query for +commentedbugs but with no restrictions on task or duplicate status:

launchpad_staging=> EXPLAIN (ANALYZE, BUFFERS) SELECT BugTaskFlat.bugtask FROM BugTaskFlat LEFT JOIN Product ON BugTaskFlat.product = Product.id AND Product.active WHERE (BugTaskFlat.product IS NULL OR Product.active = true) AND BugTaskFlat.bug IN (SELECT BugMessage.bug FROM BugMessage WHERE BugMessage.index > 0 AND BugMessage.owner = 7346751) AND (BugTaskFlat.information_type IN (1, 2) OR COALESCE((BugTaskFlat.access_grants) && (SELECT ARRAY_AGG(TeamParticipation.team) FROM TeamParticipation WHERE TeamParticipation.person = 7346751), false) OR COALESCE((BugTaskFlat.access_policies) && (SELECT ARRAY_AGG(AccessPolicyGrant.policy) FROM AccessPolicyGrant JOIN TeamParticipation ON TeamParticipation.team = AccessPolicyGrant.grantee WHERE TeamParticipation.person = 7346751), false)) ORDER BY BugTaskFlat.importance DESC, BugTaskFlat.bugtask LIMIT 76 OFFSET 0;
                                                                                QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=656.30..656.49 rows=76 width=8) (actual time=0.066..0.066 rows=1 loops=1)
   Buffers: shared hit=11
   InitPlan 1 (returns $0)
     ->  Aggregate  (cost=4.25..4.26 rows=1 width=32) (never executed)
           ->  Index Scan using teamparticipation_person_idx on teamparticipation  (cost=0.43..4.25 rows=2 width=4) (never executed)
                 Index Cond: (person = 7346751)
   InitPlan 2 (returns $2)
     ->  Aggregate  (cost=21.77..21.78 rows=1 width=32) (never executed)
           ->  Nested Loop  (cost=0.85..21.76 rows=1 width=4) (never executed)
                 ->  Index Scan using teamparticipation_person_idx on teamparticipation teamparticipation_1  (cost=0.43..4.25 rows=2 width=4) (never executed)
                       Index Cond: (person = 7346751)
                 ->  Index Only Scan using accesspolicygrant__grantee__policy__key on accesspolicygrant  (cost=0.42..8.72 rows=4 width=8) (never executed)
                       Index Cond: (grantee = teamparticipation_1.team)
                       Heap Fetches: 0
   ->  Sort  (cost=630.26..630.69 rows=172 width=8) (actual time=0.065..0.065 rows=1 loops=1)
         Sort Key: bugtaskflat.importance DESC, bugtaskflat.bugtask
         Sort Method: quicksort  Memory: 25kB
         Buffers: shared hit=11
         ->  Nested Loop Left Join  (cost=121.96..624.02 rows=172 width=8) (actual time=0.050..0.051 rows=1 loops=1)
               Filter: ((bugtaskflat.product IS NULL) OR product.active)
               Buffers: shared hit=11
               ->  Nested Loop  (cost=121.67..560.64 rows=197 width=12) (actual time=0.039..0.040 rows=1 loops=1)
                     Buffers: shared hit=8
                     ->  HashAggregate  (cost=121.24..122.00 rows=76 width=4) (actual time=0.023..0.024 rows=1 loops=1)
                           Group Key: bugmessage.bug
                           Buffers: shared hit=4
                           ->  Index Scan using bugmessage__owner__index__idx on bugmessage  (cost=0.43..121.05 rows=76 width=4) (actual time=0.017..0.018 rows=1 loops=1)
                                 Index Cond: ((owner = 7346751) AND (index > 0))
                                 Buffers: shared hit=4
                     ->  Index Scan using bugtaskflat__bug__idx on bugtaskflat  (cost=0.43..5.74 rows=3 width=16) (actual time=0.013..0.014 rows=1 loops=1)
                           Index Cond: (bug = bugmessage.bug)
                           Filter: ((information_type = ANY ('{1,2}'::integer[])) OR COALESCE((access_grants && $0), false) OR COALESCE((access_policies && $2), false))
                           Buffers: shared hit=4
               ->  Index Scan using product_pkey on product  (cost=0.29..0.31 rows=1 width=5) (actual time=0.010..0.010 rows=1 loops=1)
                     Index Cond: (bugtaskflat.product = id)
                     Filter: active
                     Buffers: shared hit=3
 Planning time: 11.878 ms
 Execution time: 0.215 ms
(39 rows)

~willamsusa (spammer), new query for +commentedbugs but with no restrictions on task or duplicate status:

launchpad_staging=> EXPLAIN (ANALYZE, BUFFERS) SELECT BugTaskFlat.bugtask FROM BugTaskFlat LEFT JOIN Product ON BugTaskFlat.product = Product.id AND Product.active WHERE (BugTaskFlat.product IS NULL OR Product.active = true) AND BugTaskFlat.bug IN (SELECT BugMessage.bug FROM BugMessage WHERE BugMessage.index > 0 AND BugMessage.owner = 7346751 UNION SELECT BugActivity.bug FROM BugActivity WHERE BugActivity.person = 7346751 AND (BugActivity.whatchanged != E'bug' OR BugActivity.message != E'added bug')) AND (BugTaskFlat.information_type IN (1, 2) OR COALESCE((BugTaskFlat.access_grants) && (SELECT ARRAY_AGG(TeamParticipation.team) FROM TeamParticipation WHERE TeamParticipation.person = 7346751), false) OR COALESCE((BugTaskFlat.access_policies) && (SELECT ARRAY_AGG(AccessPolicyGrant.policy) FROM AccessPolicyGrant JOIN TeamParticipation ON TeamParticipation.team = AccessPolicyGrant.grantee WHERE TeamParticipation.person = 7346751), false)) ORDER BY BugTaskFlat.importance DESC, BugTaskFlat.bugtask LIMIT 76 OFFSET 0;
                                                                                       QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=2077.37..2077.56 rows=76 width=8) (actual time=0.086..0.086 rows=2 loops=1)
   Buffers: shared hit=27
   InitPlan 1 (returns $0)
     ->  Aggregate  (cost=4.25..4.26 rows=1 width=32) (never executed)
           ->  Index Scan using teamparticipation_person_idx on teamparticipation  (cost=0.43..4.25 rows=2 width=4) (never executed)
                 Index Cond: (person = 7346751)
   InitPlan 2 (returns $2)
     ->  Aggregate  (cost=21.77..21.78 rows=1 width=32) (never executed)
           ->  Nested Loop  (cost=0.85..21.76 rows=1 width=4) (never executed)
                 ->  Index Scan using teamparticipation_person_idx on teamparticipation teamparticipation_1  (cost=0.43..4.25 rows=2 width=4) (never executed)
                       Index Cond: (person = 7346751)
                 ->  Index Only Scan using accesspolicygrant__grantee__policy__key on accesspolicygrant  (cost=0.42..8.72 rows=4 width=8) (never executed)
                       Index Cond: (grantee = teamparticipation_1.team)
                       Heap Fetches: 0
   ->  Sort  (cost=2051.33..2052.70 rows=547 width=8) (actual time=0.085..0.085 rows=2 loops=1)
         Sort Key: bugtaskflat.importance DESC, bugtaskflat.bugtask
         Sort Method: quicksort  Memory: 25kB
         Buffers: shared hit=27
         ->  Nested Loop Left Join  (cost=443.37..2031.51 rows=547 width=8) (actual time=0.062..0.077 rows=2 loops=1)
               Filter: ((bugtaskflat.product IS NULL) OR product.active)
               Buffers: shared hit=27
               ->  Nested Loop  (cost=443.08..1830.41 rows=625 width=12) (actual time=0.054..0.063 rows=2 loops=1)
                     Buffers: shared hit=21
                     ->  HashAggregate  (cost=442.65..445.06 rows=241 width=4) (actual time=0.042..0.044 rows=2 loops=1)
                           Group Key: bugmessage.bug
                           Buffers: shared hit=13
                           ->  Append  (cost=0.43..442.05 rows=241 width=4) (actual time=0.016..0.035 rows=5 loops=1)
                                 Buffers: shared hit=13
                                 ->  Index Scan using bugmessage__owner__index__idx on bugmessage  (cost=0.43..121.05 rows=76 width=4) (actual time=0.015..0.016 rows=1 loops=1)
                                       Index Cond: ((owner = 7346751) AND (index > 0))
                                       Buffers: shared hit=4
                                 ->  Index Scan using bugactivity_person_datechanged_idx on bugactivity  (cost=0.56..318.60 rows=165 width=4) (actual time=0.011..0.018 rows=4 loops=1)
                                       Index Cond: (person = 7346751)
                                       Filter: ((whatchanged <> 'bug'::text) OR (message <> 'added bug'::text))
                                       Rows Removed by Filter: 1
                                       Buffers: shared hit=9
                     ->  Index Scan using bugtaskflat__bug__idx on bugtaskflat  (cost=0.43..5.71 rows=3 width=16) (actual time=0.008..0.008 rows=1 loops=2)
                           Index Cond: (bug = bugmessage.bug)
                           Filter: ((information_type = ANY ('{1,2}'::integer[])) OR COALESCE((access_grants && $0), false) OR COALESCE((access_policies && $2), false))
                           Buffers: shared hit=8
               ->  Index Scan using product_pkey on product  (cost=0.29..0.31 rows=1 width=5) (actual time=0.006..0.006 rows=1 loops=2)
                     Index Cond: (bugtaskflat.product = id)
                     Filter: active
                     Buffers: shared hit=6
 Planning time: 8.463 ms
 Execution time: 0.211 ms
(46 rows)

So this does pick somewhat different indexes to use in various cases, but the end result seems to still be reasonably performant for both users with few bugs and users with many bugs.
-- 
https://code.launchpad.net/~cjwatson/launchpad/improve-bug-commenter-search/+merge/369526
Your team Launchpad code reviewers is subscribed to branch lp:launchpad.


References