v35-0006-Optimize-auxiliary-index-handling.patch
application/octet-stream
Filename: v35-0006-Optimize-auxiliary-index-handling.patch
Type: application/octet-stream
Part: 5
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v35-0006
Subject: Optimize auxiliary index handling
| File | + | − |
|---|---|---|
| src/backend/catalog/index.c | 9 | 0 |
| src/backend/executor/execIndexing.c | 4 | 1 |
| src/include/nodes/execnodes.h | 4 | 2 |
From fe5dc728bf0b00388d244a8d6141b57299d9b327 Mon Sep 17 00:00:00 2001
From: Mikhail Nikalayeu <mihailnikalayeu@gmail.com>
Date: Mon, 30 Dec 2024 16:37:12 +0100
Subject: [PATCH v35 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 eb383812901..2df77a0606d 100644
--- a/src/backend/executor/execIndexing.c
+++ b/src/backend/executor/execIndexing.c
@@ -439,8 +439,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 af58d4cf4b5..99916e150fd 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