mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
Remove disjunction in pkg_providers query
For some reason, running the SELECT .. WHERE .. OR .. query takes e.g. 58ms on a randomly generated db for some dependency name. Splitting the OR into two dedicated queries and UNIONing the result takes only 0.42ms. On the Arch Linux installation, searching for the providers of e.g. mongodb takes >=110ms when not cached by the query cache. The new query takes <1ms even when not cached. Signed-off-by: Florian Pritz <bluewind@xinu.at> Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
This commit is contained in:
parent
34a0d39910
commit
f51d4c32cd
1 changed files with 4 additions and 2 deletions
|
@ -212,10 +212,12 @@ function pkg_groups($pkgid) {
|
||||||
function pkg_providers($name) {
|
function pkg_providers($name) {
|
||||||
$dbh = DB::connect();
|
$dbh = DB::connect();
|
||||||
$q = "SELECT p.ID, p.Name FROM Packages p ";
|
$q = "SELECT p.ID, p.Name FROM Packages p ";
|
||||||
|
$q.= "WHERE p.Name = " . $dbh->quote($name) . " ";
|
||||||
|
$q.= "UNION ";
|
||||||
|
$q.= "SELECT p.ID, p.Name FROM Packages p ";
|
||||||
$q.= "LEFT JOIN PackageRelations pr ON pr.PackageID = p.ID ";
|
$q.= "LEFT JOIN PackageRelations pr ON pr.PackageID = p.ID ";
|
||||||
$q.= "LEFT JOIN RelationTypes rt ON rt.ID = pr.RelTypeID ";
|
$q.= "LEFT JOIN RelationTypes rt ON rt.ID = pr.RelTypeID ";
|
||||||
$q.= "WHERE p.Name = " . $dbh->quote($name) . " ";
|
$q.= "WHERE (rt.Name = 'provides' ";
|
||||||
$q.= "OR (rt.Name = 'provides' ";
|
|
||||||
$q.= "AND pr.RelName = " . $dbh->quote($name) . ")";
|
$q.= "AND pr.RelName = " . $dbh->quote($name) . ")";
|
||||||
$q.= "UNION ";
|
$q.= "UNION ";
|
||||||
$q.= "SELECT 0, Name FROM OfficialProviders ";
|
$q.= "SELECT 0, Name FROM OfficialProviders ";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue