mirror of https://github.com/citusdata/citus.git
152 lines
5.4 KiB
Plaintext
152 lines
5.4 KiB
Plaintext
--
|
|
-- 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;
|
|
l_partkey | aggregate
|
|
-----------+------------
|
|
194541 | 3727794642
|
|
160895 | 3671463005
|
|
183486 | 3128069328
|
|
179825 | 3093889125
|
|
162432 | 2834113536
|
|
153937 | 2761321906
|
|
199283 | 2726988572
|
|
185925 | 2672114100
|
|
196629 | 2622637602
|
|
157064 | 2614644408
|
|
(10 rows)
|
|
|
|
-- 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;
|
|
DEBUG: push down of limit count: 600
|
|
l_partkey | aggregate
|
|
-----------+------------
|
|
194541 | 3727794642
|
|
160895 | 3671463005
|
|
183486 | 3128069328
|
|
179825 | 3093889125
|
|
162432 | 2834113536
|
|
153937 | 2761321906
|
|
199283 | 2726988572
|
|
185925 | 2672114100
|
|
196629 | 2622637602
|
|
157064 | 2614644408
|
|
(10 rows)
|
|
|
|
-- 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;
|
|
c_custkey | c_name | lineitem_count
|
|
-----------+--------------------+----------------
|
|
43 | Customer#000000043 | 42
|
|
370 | Customer#000000370 | 40
|
|
79 | Customer#000000079 | 38
|
|
689 | Customer#000000689 | 38
|
|
685 | Customer#000000685 | 37
|
|
472 | Customer#000000472 | 36
|
|
643 | Customer#000000643 | 34
|
|
226 | Customer#000000226 | 33
|
|
496 | Customer#000000496 | 32
|
|
304 | Customer#000000304 | 31
|
|
(10 rows)
|
|
|
|
-- 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;
|
|
DEBUG: push down of limit count: 150
|
|
c_custkey | c_name | lineitem_count
|
|
-----------+--------------------+----------------
|
|
43 | Customer#000000043 | 42
|
|
370 | Customer#000000370 | 38
|
|
79 | Customer#000000079 | 37
|
|
689 | Customer#000000689 | 36
|
|
472 | Customer#000000472 | 35
|
|
685 | Customer#000000685 | 35
|
|
643 | Customer#000000643 | 34
|
|
226 | Customer#000000226 | 33
|
|
496 | Customer#000000496 | 32
|
|
304 | Customer#000000304 | 31
|
|
(10 rows)
|
|
|
|
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;
|
|
l_partkey | average
|
|
-----------+-----------------------
|
|
9998 | 9999.0000000000000000
|
|
102466 | 9997.0000000000000000
|
|
184959 | 9996.0000000000000000
|
|
17492 | 9994.0000000000000000
|
|
124966 | 9991.0000000000000000
|
|
89989 | 9990.0000000000000000
|
|
32479 | 9989.0000000000000000
|
|
144960 | 9989.0000000000000000
|
|
147473 | 9988.0000000000000000
|
|
37481 | 9985.0000000000000000
|
|
(10 rows)
|
|
|
|
-- 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;
|
|
l_partkey | complex_expression
|
|
-----------+--------------------
|
|
160895 | 22816
|
|
194541 | 19160
|
|
37018 | 19044
|
|
64284 | 18594
|
|
15283 | 18357
|
|
1927 | 18284
|
|
136884 | 18194
|
|
114073 | 18192
|
|
1051 | 18156
|
|
41555 | 18136
|
|
(10 rows)
|
|
|
|
-- 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;
|
|
count_quantity | l_quantity
|
|
----------------+------------
|
|
227 | 3.00
|
|
232 | 7.00
|
|
237 | 2.00
|
|
242 | 6.00
|
|
243 | 1.00
|
|
244 | 4.00
|
|
250 | 8.00
|
|
254 | 5.00
|
|
258 | 9.00
|
|
(9 rows)
|
|
|
|
RESET citus.limit_clause_row_fetch_count;
|
|
RESET client_min_messages;
|