William Grant has proposed merging lp:~wgrant/launchpad/bug-1007140 into 
lp:launchpad.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)
Related bugs:
  Bug #1007140 in Launchpad itself: "Person:EntryResource:getRequestedReviews 
timeout because of BranchMergeProposal"
  https://bugs.launchpad.net/launchpad/+bug/1007140
  Bug #1031764 in Launchpad itself: "timeout on 
code.launchpad.net/~ubuntu-branches"
  https://bugs.launchpad.net/launchpad/+bug/1031764

For more details, see:
https://code.launchpad.net/~wgrant/launchpad/bug-1007140/+merge/123688

This branch tweaks get_branch_privacy_filter to outsmart the query planner. See 
https://bugs.launchpad.net/launchpad/+bug/1007140/comments/1 for 
details/explains, but basically PostgreSQL was severely misplanning some 
complex branch queries for people with lots of teams, and slightly misplanning 
for people with not many teams. By replacing the traditional IN with an array 
intersection operation, the planner somehow realises the inner subquery is 
uncorrelated and is able to pull it right out to the top. This makes a number 
of BMP queries 10-200x faster, and leaves the already good queries just as 
quick.
-- 
https://code.launchpad.net/~wgrant/launchpad/bug-1007140/+merge/123688
Your team Launchpad code reviewers is requested to review the proposed merge of 
lp:~wgrant/launchpad/bug-1007140 into lp:launchpad.
=== modified file 'lib/lp/code/model/branch.py'
--- lib/lp/code/model/branch.py	2012-09-05 21:51:06 +0000
+++ lib/lp/code/model/branch.py	2012-09-11 08:03:23 +0000
@@ -170,6 +170,7 @@
     sqlvalues,
     )
 from lp.services.database.stormexpr import (
+    Array,
     ArrayAgg,
     ArrayIntersects,
     )
@@ -1622,15 +1623,17 @@
                 where=(TeamParticipation.person == user)
             )), False)
 
-    policy_grant_query = branch_class.access_policy.is_in(
+    policy_grant_query = Coalesce(
+        ArrayIntersects(
+            Array(branch_class.access_policy),
             Select(
-                AccessPolicyGrant.policy_id,
+                ArrayAgg(AccessPolicyGrant.policy_id),
                 tables=(AccessPolicyGrant,
                         Join(TeamParticipation,
                             TeamParticipation.teamID ==
                             AccessPolicyGrant.grantee_id)),
                 where=(TeamParticipation.person == user)
-            ))
+            )), False)
 
     return [
         Or(public_branch_filter, artifact_grant_query, policy_grant_query)]

_______________________________________________
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