[open-ils-commits] r19264 - branches/rel_1_6_2/Open-ILS/src/sql/Pg (gmc)

svn at svn.open-ils.org svn at svn.open-ils.org
Mon Jan 24 13:43:07 EST 2011


Author: gmc
Date: 2011-01-24 13:43:03 -0500 (Mon, 24 Jan 2011)
New Revision: 19264

Modified:
   branches/rel_1_6_2/Open-ILS/src/sql/Pg/300.schema.staged_search.sql
Log:
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 <gmc at esilibrary.com>

Modified: branches/rel_1_6_2/Open-ILS/src/sql/Pg/300.schema.staged_search.sql
===================================================================
--- branches/rel_1_6_2/Open-ILS/src/sql/Pg/300.schema.staged_search.sql	2011-01-24 18:42:13 UTC (rev 19263)
+++ branches/rel_1_6_2/Open-ILS/src/sql/Pg/300.schema.staged_search.sql	2011-01-24 18:43:03 UTC (rev 19264)
@@ -232,7 +232,7 @@
 
         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 @@
     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



More information about the open-ils-commits mailing list