mirror of https://github.com/citusdata/citus.git
74 lines
2.5 KiB
SQL
74 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. For this
|
|
-- test, we also change a config setting to ensure that we don't repartition any
|
|
-- of the tables during the query.
|
|
|
|
SET citus.limit_clause_row_fetch_count TO 150;
|
|
SET citus.large_table_shard_count TO 2;
|
|
|
|
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;
|
|
|
|
RESET citus.large_table_shard_count;
|
|
|
|
-- 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) AS average FROM lineitem
|
|
GROUP BY l_partkey
|
|
ORDER BY average 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;
|