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
··· 131 132 languageQuery := fmt.Sprintf( 133 ` 134 - select 135 - repo_at, language 136 - from 137 - repo_languages r1 138 - where 139 - repo_at IN (%s) 140 and is_default_ref = 1 141 - and id = ( 142 - select id 143 - from repo_languages r2 144 - where r2.repo_at = r1.repo_at 145 - and r2.is_default_ref = 1 146 - order by bytes desc 147 - limit 1 148 - ); 149 `, 150 inClause, 151 )
··· 131 132 languageQuery := fmt.Sprintf( 133 ` 134 + select repo_at, language 135 + from ( 136 + select 137 + repo_at, 138 + language, 139 + row_number() over ( 140 + partition by repo_at 141 + order by bytes desc 142 + ) as rn 143 + from repo_languages 144 + where repo_at in (%s) 145 and is_default_ref = 1 146 + ) 147 + where rn = 1 148 `, 149 inClause, 150 )