From e07ab5f8c1f6fdcc3e715f1e6630e9cc6631ccd2 Mon Sep 17 00:00:00 2001 From: Rayson Zhu Date: Aug 16 2016 13:32:04 +0000 Subject: optimize table joins for faster counting performance Tests shows that changing inner joins to left outer joins on non-null fields will significantly improve the counting performance on PostgreSQL server 9.X. Only large tables (task, build, and rpminfo) are involved in this commit. --- diff --git a/hub/kojihub.py b/hub/kojihub.py index c88946c..9bc17cd 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -3526,7 +3526,7 @@ def list_rpms(buildID=None, buildrootID=None, imageID=None, componentBuildrootID ('rpminfo.metadata_only', 'metadata_only'), ('rpminfo.extra', 'extra'), ] - joins = ['external_repo ON rpminfo.external_repo_id = external_repo.id'] + joins = ['LEFT JOIN external_repo ON rpminfo.external_repo_id = external_repo.id'] clauses = [] if buildID != None: @@ -9047,10 +9047,10 @@ class RootExports(object): ('users.id', 'owner_id'), ('users.name', 'owner_name')] tables = ['build'] - joins = ['events ON build.create_event = events.id', - 'package ON build.pkg_id = package.id', - 'volume ON build.volume_id = volume.id', - 'users ON build.owner = users.id'] + joins = ['LEFT JOIN events ON build.create_event = events.id', + 'LEFT JOIN package ON build.pkg_id = package.id', + 'LEFT JOIN volume ON build.volume_id = volume.id', + 'LEFT JOIN users ON build.owner = users.id'] clauses = [] if packageID != None: clauses.append('package.id = %(packageID)i') @@ -9763,7 +9763,7 @@ class RootExports(object): queryOpts = {} tables = ['task'] - joins = ['users ON task.owner = users.id'] + joins = ['LEFT JOIN users ON task.owner = users.id'] flist = Task.fields + ( ('task.request', 'request'), ('task.result', 'result'),