Make wrong permissions query more efficient

This removes the subplan and per-row query in favor of a LEFT JOIN where
we look for non-matching rows. Tested in sqlite3 and PostgreSQL.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2012-10-12 11:34:49 -05:00
parent f0b7e73de6
commit a71aa2e354

View File

@ -228,12 +228,13 @@ def get_wrong_permissions():
FROM packages p
JOIN packages_packagerelation pr ON p.pkgbase = pr.pkgbase
WHERE pr.type = %s
) pkgs
WHERE pkgs.repo_id NOT IN (
SELECT repo_id FROM user_profiles_allowed_repos ar
) mp
LEFT JOIN (
SELECT user_id, repo_id FROM user_profiles_allowed_repos ar
INNER JOIN user_profiles up ON ar.userprofile_id = up.id
WHERE up.user_id = pkgs.user_id
)
) ur
ON mp.user_id = ur.user_id AND mp.repo_id = ur.repo_id
WHERE ur.user_id IS NULL;
"""
cursor = connection.cursor()
cursor.execute(sql, [PackageRelation.MAINTAINER])