v18-0005-Reduce-bms_is_empty_internal-function-call.patch

application/octet-stream

Filename: v18-0005-Reduce-bms_is_empty_internal-function-call.patch
Type: application/octet-stream
Part: 4
Message: Re: [PoC] Reducing planning time when tables have many partitions

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 v18-0005
Subject: Reduce bms_is_empty_internal() function call
File+
src/backend/nodes/bitmapset.c 8 2
From c748ed6c858873812e7a5bc7d9a846bb2c2673ac Mon Sep 17 00:00:00 2001
From: Yuya Watari <watari.yuya@gmail.com>
Date: Fri, 10 Mar 2023 15:01:26 +0900
Subject: [PATCH v18 5/5] Reduce bms_is_empty_internal() function call

Originally, we checked whether the result was empty or not by calling
bms_is_empty_internal() function at the end of bms_int_members().
However, this leads to redundant looping over the bitmapset. This
commit reduces this call and improves the performance.
---
 src/backend/nodes/bitmapset.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c
index af87da15fb..b8f4f85361 100644
--- a/src/backend/nodes/bitmapset.c
+++ b/src/backend/nodes/bitmapset.c
@@ -929,6 +929,7 @@ bms_int_members(Bitmapset *a, const Bitmapset *b)
 {
 	int			shortlen;
 	int			i;
+	bool		result_is_empty = true;
 
 	/* Handle cases where either input is NULL */
 	if (a == NULL)
@@ -941,7 +942,12 @@ bms_int_members(Bitmapset *a, const Bitmapset *b)
 	/* Intersect b into a; we need never copy */
 	shortlen = Min(a->nwords, b->nwords);
 	for (i = 0; i < shortlen; i++)
-		a->words[i] &= b->words[i];
+	{
+		bitmapword	w = (a->words[i] &= b->words[i]);
+
+		if (w != 0)
+			result_is_empty = false;
+	}
 
 	/*
 	 * We simply shorten the left input to both remove the need to zero the
@@ -953,7 +959,7 @@ bms_int_members(Bitmapset *a, const Bitmapset *b)
 	a->nwords = shortlen;
 
 	/* If we computed an empty result, we must return NULL */
-	if (bms_is_empty_internal(a))
+	if (result_is_empty)
 	{
 		pfree(a);
 		return NULL;
-- 
2.39.2.windows.1