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

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


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

Modified:
   branches/rel_1_6_0/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_0/Open-ILS/src/sql/Pg/300.schema.staged_search.sql
===================================================================
--- branches/rel_1_6_0/Open-ILS/src/sql/Pg/300.schema.staged_search.sql	2011-01-24 18:43:03 UTC (rev 19264)
+++ branches/rel_1_6_0/Open-ILS/src/sql/Pg/300.schema.staged_search.sql	2011-01-24 18:43:26 UTC (rev 19265)
@@ -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