Estimate Actual Operator 5 5 AGGREGATECOUNT(*) GROUPBYSORT o_orderpriority
15 15 AGGREGATE PARTIAL COUNT(*) GROUPBYSORT o_orderpriority
20847 51276 SORT o_orderpriority
20847 51276 LEFTSEMIJOINLOOPON l_orderkey = o_orderkey
71532 55935 │└TABLESCAN orders AS orders WHERE (o_orderdate >= '1995-02-01') AND (o_orderdate < '1995-05-01')
279675 55935 TABLESEEK lineitem AS lineitem WHERE l_commitdate < l_receiptdate
SQL Server
Estimate Actual Operator 5 5 SORT o_orderpriority
5 5 PROJECT CONVERT_IMPLICIT(int,Expr1014,0) AS Expr1007
5 5 AGGREGATECOUNT(*) AS Expr1014 GROUPBYHASH o_orderpriority
44574 51276 INNERJOINHASHON l_orderkey = o_orderkey
54864 55935 │└TABLESCAN orders WHERE o_orderdate >= '1995-02-01' AND o_orderdate < '1995-05-01'
180036 141050 TABLESCAN lineitem WHERE (BLOOM(l_orderkey)) AND (l_commitdate < l_receiptdate)
Commentary
EXIST decorrelation into SEMI JOIN
This expression shoudl be decorrelated:
EXISTS (SELECT *
FROM tpch.lineitem
WHERE l_orderkey = o_orderkey
AND l_commitdate < l_receiptdate)
Optimizers will generally convert this into a SEMI JOIN.
Flipping the inner and outer side of the join (for optimisers that know how to do this) will greatly reduce the amount of memory consumed and it opens up additional opportunities for bloom filtering.