appview/db: improve repo-languages query #584

merged
opened by oppi.li targeting master from push-xvuvxolnykpl

switch from corelated query to window function. practically, this gives us a 10x speedup for this portion of the function. we can go further by running each subquery for GetRepos concurrently, but the potential wins here is in the order of ~2ms.

Signed-off-by: oppiliappan me@oppi.li

Changed files
+13 -14
appview
+13 -14
appview/db/repos.go
···
languageQuery := fmt.Sprintf(
`
-
select
-
repo_at, language
-
from
-
repo_languages r1
-
where
-
repo_at IN (%s)
and is_default_ref = 1
-
and id = (
-
select id
-
from repo_languages r2
-
where r2.repo_at = r1.repo_at
-
and r2.is_default_ref = 1
-
order by bytes desc
-
limit 1
-
);
`,
inClause,
)
···
languageQuery := fmt.Sprintf(
`
+
select repo_at, language
+
from (
+
select
+
repo_at,
+
language,
+
row_number() over (
+
partition by repo_at
+
order by bytes desc
+
) as rn
+
from repo_languages
+
where repo_at in (%s)
and is_default_ref = 1
+
)
+
where rn = 1
`,
inClause,
)