From: gmc Date: Mon, 24 Jan 2011 18:43:03 +0000 (+0000) Subject: improve performance of multi-class searches X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=940a7011d8ccff4b729eb940e4c898f4ec6afca1;p=Evergreen.git improve performance of multi-class searches Backport of trunk commit 18233. For as yet unknown reasons, Postgres sometimes uses nested loops instead of hash joins when joining subqueries in a multi-class bib search. This can result in searches such as "author:rowling title:harry potter" never completing. Removing the interior limit clause can both speed up the query and make search results more accurate when combining queries of two or more common words. Signed-off-by: Galen Charlton git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_6_2@19264 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/src/sql/Pg/300.schema.staged_search.sql b/Open-ILS/src/sql/Pg/300.schema.staged_search.sql index 30ef658c38..aaa73b74ba 100644 --- a/Open-ILS/src/sql/Pg/300.schema.staged_search.sql +++ b/Open-ILS/src/sql/Pg/300.schema.staged_search.sql @@ -232,7 +232,7 @@ BEGIN from_clause := from_clause || ' JOIN ( SELECT * FROM ' || query_table || ' WHERE ' || inner_where_clause || - CASE WHEN core_rel_limit > 0 THEN ' LIMIT ' || core_rel_limit::TEXT ELSE '' END || ' ) AS ' || query_part.table_alias || + ' ) AS ' || query_part.table_alias || ' ON ( m.source = ' || query_part.table_alias || '.source )' || ' JOIN config.metabib_field AS ' || query_part.table_alias || '_weight' || ' ON ( ' || query_part.table_alias || '.field = ' || query_part.table_alias || '_weight.id AND ' || query_part.table_alias || '_weight.search_field)'; @@ -349,7 +349,8 @@ BEGIN END IF; core_rel_query := select_clause || from_clause || where_clause || - ' GROUP BY 1 ORDER BY 4' || CASE WHEN sort_desc THEN ' DESC' ELSE ' ASC' END || ';'; + ' GROUP BY 1 ORDER BY 4' || CASE WHEN sort_desc THEN ' DESC' ELSE ' ASC' END || + CASE WHEN core_rel_limit > 0 THEN ' LIMIT ' || core_rel_limit::TEXT ELSE '' END || ';'; --RAISE NOTICE 'Base Query: %', core_rel_query; IF param_search_ou > 0 THEN