Skip to content

Commit 8f728e6

Browse files
committed
Fix cardinality estimations for semi/anti joins
1 parent 051c625 commit 8f728e6

3 files changed

Lines changed: 11 additions & 3 deletions

File tree

src/jrd/optimizer/Optimizer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ inline constexpr double REDUCE_SELECTIVITY_FACTOR_LESS = 0.05;
5252
inline constexpr double REDUCE_SELECTIVITY_FACTOR_GREATER = 0.05;
5353
inline constexpr double REDUCE_SELECTIVITY_FACTOR_STARTING = 0.01;
5454
inline constexpr double REDUCE_SELECTIVITY_FACTOR_OTHER = 0.01;
55+
inline constexpr double REDUCE_SELECTIVITY_FACTOR_ANY = 0.5;
5556

5657
// Cost of simple (CPU bound) operations is less than the page access cost
5758
inline constexpr double COST_FACTOR_MEMCOPY = 0.5;

src/jrd/recsrc/HashJoin.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ void HashJoin::init(thread_db* tdbb, CompilerScratch* csb, FB_SIZE_T count,
314314
const auto subRsb = args[i];
315315
fb_assert(subRsb);
316316

317-
m_cardinality *= subRsb->getCardinality();
317+
if (m_joinType == JoinType::INNER || m_joinType == JoinType::OUTER)
318+
m_cardinality *= subRsb->getCardinality();
318319

319320
SubStream sub;
320321
sub.buffer = FB_NEW_POOL(csb->csb_pool) BufferedStream(csb, subRsb);
@@ -352,7 +353,10 @@ void HashJoin::init(thread_db* tdbb, CompilerScratch* csb, FB_SIZE_T count,
352353
}
353354

354355
if (!selectivity)
355-
selectivity = pow(REDUCE_SELECTIVITY_FACTOR_EQUALITY, keyCount);
356+
{
357+
selectivity = (m_joinType == JoinType::INNER || m_joinType == JoinType::OUTER) ?
358+
pow(REDUCE_SELECTIVITY_FACTOR_EQUALITY, keyCount) : REDUCE_SELECTIVITY_FACTOR_ANY;
359+
}
356360

357361
m_cardinality *= selectivity;
358362
}

src/jrd/recsrc/NestedLoopJoin.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ NestedLoopJoin::NestedLoopJoin(CompilerScratch* csb,
5757
fb_assert(outer && inner);
5858

5959
m_impure = csb->allocImpure<Impure>();
60-
m_cardinality = outer->getCardinality() * inner->getCardinality();
60+
61+
m_cardinality = outer->getCardinality();
62+
m_cardinality *= (m_joinType == JoinType::INNER || m_joinType == JoinType::OUTER) ?
63+
inner->getCardinality() : REDUCE_SELECTIVITY_FACTOR_ANY;
6164

6265
m_args.add(outer);
6366
m_args.add(inner);

0 commit comments

Comments
 (0)