-- -- MULTI_LIMIT_CLAUSE_APPROXIMATE -- -- Display debug messages on limit clause push down. SET client_min_messages TO DEBUG1; -- We first look at results with limit optimization disabled. This first query -- has a group and an order by. The order by clause is a commutative aggregate -- function. SELECT l_partkey, sum(l_partkey * (1 + l_suppkey)) AS aggregate FROM lineitem GROUP BY l_partkey ORDER BY aggregate DESC LIMIT 10; -- Enable limit optimization to fetch one third of each shard's data SET citus.limit_clause_row_fetch_count TO 600; SELECT l_partkey, sum(l_partkey * (1 + l_suppkey)) AS aggregate FROM lineitem GROUP BY l_partkey ORDER BY aggregate DESC LIMIT 10; -- Disable limit optimization for our second test. This time, we have a query -- that joins several tables, and that groups and orders the results. RESET citus.limit_clause_row_fetch_count; SELECT c_custkey, c_name, count(*) as lineitem_count FROM customer, orders, lineitem WHERE c_custkey = o_custkey AND l_orderkey = o_orderkey GROUP BY c_custkey, c_name ORDER BY lineitem_count DESC, c_custkey LIMIT 10; -- Now, enable limit optimization to fetch half of each task's results. SET citus.limit_clause_row_fetch_count TO 150; SELECT c_custkey, c_name, count(*) as lineitem_count FROM customer, orders, lineitem WHERE c_custkey = o_custkey AND l_orderkey = o_orderkey GROUP BY c_custkey, c_name ORDER BY lineitem_count DESC, c_custkey LIMIT 10; -- We now test scenarios where applying the limit optimization wouldn't produce -- meaningful results. First, we check that we don't push down the limit clause -- for non-commutative aggregates. SELECT l_partkey, avg(l_suppkey) FROM lineitem GROUP BY l_partkey ORDER BY 2 DESC, l_partkey LIMIT 10; SELECT l_partkey, stddev(l_suppkey::float8) FROM lineitem GROUP BY l_partkey ORDER BY 2 DESC NULLS LAST, l_partkey LIMIT 10; -- also test that we handle execution on coordinator properly SELECT l_partkey, avg(distinct l_suppkey) FROM lineitem GROUP BY l_partkey ORDER BY 2 DESC, l_partkey LIMIT 10; -- Next, check that we don't apply the limit optimization for expressions that -- have aggregates within them SELECT l_partkey, round(sum(l_suppkey)) AS complex_expression FROM lineitem GROUP BY l_partkey ORDER BY complex_expression DESC LIMIT 10; -- Check that query execution works as expected for other queries without limits SELECT count(*) count_quantity, l_quantity FROM lineitem WHERE l_quantity < 10.0 GROUP BY l_quantity ORDER BY count_quantity ASC, l_quantity ASC; RESET citus.limit_clause_row_fetch_count; RESET client_min_messages;