From: Peter Eisentraut Date: Fri, 7 Mar 2025 10:20:26 +0000 (+0100) Subject: Improve possible performance regression X-Git-Tag: REL_18_BETA1~656 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=7f24c0274385ea3d4c797cc2fd60d9a55f3a8d74;p=postgresql.git Improve possible performance regression Commit ce62f2f2a0a introduced calls to GetIndexAmRoutineByAmId() in lsyscache.c functions. This call is a bit more expensive than a simple syscache lookup. So rearrange the nesting so that we call that one last and do the cheaper checks first. Reported-by: Tom Lane Discussion: https://www.postgresql.org/message-id/flat/E1tngY6-0000UL-2n%40gemulon.postgresql.org --- diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 97ad36a031b..a712a432938 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -717,11 +717,16 @@ equality_ops_are_compatible(Oid opno1, Oid opno2) { HeapTuple op_tuple = &catlist->members[i]->tuple; Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple); - IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false); - if (amroutine->amconsistentequality) + /* + * op_in_opfamily() is cheaper than GetIndexAmRoutineByAmId(), so + * check it first + */ + if (op_in_opfamily(opno2, op_form->amopfamily)) { - if (op_in_opfamily(opno2, op_form->amopfamily)) + IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false); + + if (amroutine->amconsistentequality) { result = true; break; @@ -768,11 +773,16 @@ comparison_ops_are_compatible(Oid opno1, Oid opno2) { HeapTuple op_tuple = &catlist->members[i]->tuple; Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple); - IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false); - if (amroutine->amcanorder && amroutine->amconsistentordering) + /* + * op_in_opfamily() is cheaper than GetIndexAmRoutineByAmId(), so + * check it first + */ + if (op_in_opfamily(opno2, op_form->amopfamily)) { - if (op_in_opfamily(opno2, op_form->amopfamily)) + IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false); + + if (amroutine->amcanorder && amroutine->amconsistentordering) { result = true; break;