citus/src/test/regress/sql/multi_limit_clause_approxim...

78 lines
2.5 KiB
SQL

--
-- 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;