From 17191fcaeb5d38fbb2f4181e04814c62df6d771d Mon Sep 17 00:00:00 2001 From: Mikhail Nikalayeu Date: Mon, 30 Dec 2024 16:37:12 +0100 Subject: [PATCH v34 6/7] Optimize auxiliary index handling Skip unnecessary computations for auxiliary indices by: - in the index-insert path, detect auxiliary indexes and bypass Datum value computation - set indexUnchanged=false for auxiliary indices to avoid redundant checks These optimizations reduce overhead during concurrent index operations. --- src/backend/catalog/index.c | 9 +++++++++ src/backend/executor/execIndexing.c | 5 ++++- src/include/nodes/execnodes.h | 6 ++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 9136dfc7c73..4edf68aced2 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -2940,6 +2940,15 @@ FormIndexDatum(IndexInfo *indexInfo, ListCell *indexpr_item; int i; + /* Auxiliary index does not need any values to be computed */ + if (unlikely(indexInfo->ii_Auxiliary)) + { + Assert(indexInfo->ii_Am == STIR_AM_OID); + memset(values, 0, sizeof(Datum) * indexInfo->ii_NumIndexAttrs); + memset(isnull, true, sizeof(bool) * indexInfo->ii_NumIndexAttrs); + return; + } + if (indexInfo->ii_Expressions != NIL && indexInfo->ii_ExpressionsState == NIL) { diff --git a/src/backend/executor/execIndexing.c b/src/backend/executor/execIndexing.c index 4363e154c0f..84e99d653ec 100644 --- a/src/backend/executor/execIndexing.c +++ b/src/backend/executor/execIndexing.c @@ -438,8 +438,11 @@ ExecInsertIndexTuples(ResultRelInfo *resultRelInfo, * There's definitely going to be an index_insert() call for this * index. If we're being called as part of an UPDATE statement, * consider if the 'indexUnchanged' = true hint should be passed. + * + * For auxiliary indexes, always pass false to skip value comparison checks, + * since auxiliary indexes only store TIDs and don't track value changes. */ - indexUnchanged = ((flags & EIIT_IS_UPDATE) && + indexUnchanged = ((flags & EIIT_IS_UPDATE) && !indexInfo->ii_Auxiliary && index_unchanged_by_update(resultRelInfo, estate, indexInfo, diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index f1605e00cdc..62f797bc197 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -169,8 +169,10 @@ typedef struct ExprState * entries for a particular index. Used for both index_build and * retail creation of index entries. * - * ii_Concurrent, ii_BrokenHotChain, ii_Auxiliary and ii_ParallelWorkers - * are used only during index build; they're conventionally zeroed otherwise. + * ii_Concurrent, ii_BrokenHotChain, and ii_ParallelWorkers are used only + * during index build; they're conventionally zeroed otherwise. ii_Auxiliary + * is also used during retail inserts to skip datum formation for auxiliary + * indexes. * ---------------- */ typedef struct IndexInfo -- 2.43.0