From 7f24c0274385ea3d4c797cc2fd60d9a55f3a8d74 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 7 Mar 2025 11:20:26 +0100 Subject: [PATCH] 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 --- src/backend/utils/cache/lsyscache.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) 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; -- 2.39.5