Skip to content

Commit e8de18c

Browse files
committed
Some adjustments to the selectivity factors
1 parent 7f71e94 commit e8de18c

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

src/jrd/optimizer/Optimizer.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -365,12 +365,19 @@ class Optimizer final : public Firebird::PermanentStorage
365365
{
366366
auto factor = REDUCE_SELECTIVITY_FACTOR_OTHER;
367367

368-
if (const auto binaryNode = nodeAs<BinaryBoolNode>(node))
368+
if (const auto notNode = nodeAs<NotBoolNode>(node))
369369
{
370+
factor = MAXIMUM_SELECTIVITY - getSelectivity(notNode->arg);
371+
}
372+
else if (const auto binaryNode = nodeAs<BinaryBoolNode>(node))
373+
{
374+
const auto selectivity1 = getSelectivity(binaryNode->arg1);
375+
const auto selectivity2 = getSelectivity(binaryNode->arg2);
376+
370377
if (binaryNode->blrOp == blr_and)
371-
factor = getSelectivity(binaryNode->arg1) * getSelectivity(binaryNode->arg2);
378+
factor = selectivity1 * selectivity2;
372379
else if (binaryNode->blrOp == blr_or)
373-
factor = getSelectivity(binaryNode->arg1) + getSelectivity(binaryNode->arg2);
380+
factor = selectivity1 + selectivity2 - selectivity1 * selectivity2;
374381
else
375382
fb_assert(false);
376383
}

0 commit comments

Comments
 (0)