From 87bf0c7cdaa1d3581c289303589a5a81d6705b74 Mon Sep 17 00:00:00 2001 From: Jianghua Yang Date: Sat, 24 Jan 2026 04:44:25 +0800 Subject: [PATCH] ORCA: Optimize CDatumSortedSet by checking IsSorted before sorting Check IsSorted before Sort to reduce O(n log n) to O(n-1) comparisons for pre-sorted IN lists, improving ORCA optimization time. --- src/backend/gporca/libgpopt/src/base/CDatumSortedSet.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/gporca/libgpopt/src/base/CDatumSortedSet.cpp b/src/backend/gporca/libgpopt/src/base/CDatumSortedSet.cpp index 7b141e767bc..0fe4481953d 100644 --- a/src/backend/gporca/libgpopt/src/base/CDatumSortedSet.cpp +++ b/src/backend/gporca/libgpopt/src/base/CDatumSortedSet.cpp @@ -42,7 +42,13 @@ CDatumSortedSet::CDatumSortedSet(CMemoryPool *mp, CExpression *pexprArray, { return; } - aprngdatum->Sort(&CUtils::IDatumCmp); + // Only sort if not already sorted - IsSorted is O(n-1) comparisons, + // while Sort is O(n log n), so this optimization helps when data + // is already sorted (common case for IN lists in queries) + if (!aprngdatum->IsSorted(&CUtils::IDatumCmp)) + { + aprngdatum->Sort(&CUtils::IDatumCmp); + } // de-duplicate const ULONG ulRangeArrayArity = aprngdatum->Size();