Style fix for subquery pushdown regression tests

With this commit we intented a more consistent style for the
regression tests we've added in the
  - multi_subquery_union.sql
  - multi_subquery_complex_queries.sql
  - multi_subquery_behavioral_analytics.sql
pull/1340/head
Onder Kalaci 2017-04-19 11:10:36 +03:00
parent 146beb3336
commit e86a867fbf
6 changed files with 4507 additions and 3348 deletions

View File

@ -382,7 +382,12 @@ ORDER BY
( (
SELECT SELECT
users_table.user_id, users_table.user_id,
CASE WHEN events_table.event_type > 10 AND events_table.event_type < 12 THEN 'action=>1' ELSE 'action=>2' END AS event, CASE
WHEN
events_table.event_type > 10 AND events_table.event_type < 12
THEN 'action=>1'
ELSE 'action=>2'
END AS event,
events_table.time events_table.time
FROM FROM
users_table, users_table,
@ -616,10 +621,17 @@ HINT: Consider using an equality filter on the distributed table's partition co
------------------------------------ ------------------------------------
SELECT user_id, value_1 from SELECT user_id, value_1 from
( (
SELECT user_id, value_1 From users_table SELECT
WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1 user_id, value_1 From users_table
WHERE
value_2 > 100 and user_id = 15
GROUP BY
value_1, user_id
HAVING
count(*) > 1
) AS a ) AS a
ORDER BY user_id ASC, value_1 ASC; ORDER BY
user_id ASC, value_1 ASC;
user_id | value_1 user_id | value_1
---------+--------- ---------+---------
15 | 212 15 | 212
@ -633,10 +645,16 @@ ORDER BY user_id ASC, value_1 ASC;
-- same query with additional filter to make it not router plannable -- same query with additional filter to make it not router plannable
SELECT user_id, value_1 from SELECT user_id, value_1 from
( (
SELECT user_id, value_1 From users_table SELECT
WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1 user_id, value_1 From users_table
WHERE
value_2 > 100 and (user_id = 15 OR user_id = 16)
GROUP BY
value_1, user_id
HAVING count(*) > 1
) AS a ) AS a
ORDER BY user_id ASC, value_1 ASC; ORDER BY
user_id ASC, value_1 ASC;
user_id | value_1 user_id | value_1
---------+--------- ---------+---------
15 | 212 15 | 212
@ -658,12 +676,15 @@ ORDER BY user_id ASC, value_1 ASC;
SELECT user_id SELECT user_id
FROM events_table FROM events_table
WHERE WHERE
event_type = 16 AND value_2 > 50 event_type = 16 AND value_2 > 50 AND
AND user_id IN user_id IN
(SELECT user_id (SELECT
FROM users_table user_id
FROM
users_table
WHERE WHERE
value_1 = 15 AND value_2 > 25); value_1 = 15 AND value_2 > 25
);
ERROR: could not run distributed query with join types other than INNER or OUTER JOINS ERROR: could not run distributed query with join types other than INNER or OUTER JOINS
HINT: Consider joining tables on partition column and have equal filter on joining columns. HINT: Consider joining tables on partition column and have equal filter on joining columns.
------------------------------------ ------------------------------------
@ -684,10 +705,15 @@ SELECT user_id FROM
user_id user_id
FROM FROM
events_table events_table
WHERE event_type = 901 WHERE
GROUP BY user_id HAVING count(*) > 3 event_type = 901
GROUP BY
user_id
HAVING
count(*) > 3
) AS a ) AS a
ORDER BY user_id; ORDER BY
user_id;
user_id user_id
--------- ---------
57 57
@ -710,7 +736,8 @@ FROM
short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50 short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
) temp ) temp
ON users_table.user_id = temp.user_id ON users_table.user_id = temp.user_id
WHERE users_table.value_1 < 50; WHERE
users_table.value_1 < 50;
-- get some statistics from the aggregated results to ensure the results are correct -- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets; SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
count | count | avg count | count | avg
@ -723,13 +750,17 @@ DROP TABLE assets;
-- original query that fails -- original query that fails
SELECT count(*) FROM SELECT count(*) FROM
( (
SELECT user_id SELECT
FROM users_table user_id
WHERE (value_1 = '5' FROM
OR value_1 = '13') users_table
AND user_id NOT IN (select user_id from users_table where value_1 = '3') WHERE
GROUP BY user_id (value_1 = '5' OR value_1 = '13') AND
HAVING count(distinct value_1) = 2 user_id NOT IN (select user_id from users_table where value_1 = '3')
GROUP BY
user_id
HAVING
count(distinct value_1) = 2
) as foo; ) as foo;
ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys
DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator. DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator.
@ -742,8 +773,10 @@ SELECT subquery_count FROM
users_table users_table
WHERE WHERE
(value_1 = '5' OR value_1 = '13') (value_1 = '5' OR value_1 = '13')
GROUP BY user_id GROUP BY
HAVING count(distinct value_1) = 2) as a user_id
HAVING
count(distinct value_1) = 2) as a
LEFT JOIN LEFT JOIN
(SELECT (SELECT
user_id user_id
@ -751,8 +784,14 @@ SELECT subquery_count FROM
users_table users_table
WHERE WHERE
(value_1 = '3') (value_1 = '3')
GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL GROUP BY
GROUP BY a.user_id) AS inner_subquery; user_id) as b
ON a.user_id = b.user_id
WHERE
b.user_id IS NULL
GROUP BY
a.user_id
) AS inner_subquery;
subquery_count subquery_count
---------------- ----------------
1 1
@ -767,8 +806,10 @@ FROM (
users_table users_table
WHERE WHERE
(value_1 = '5' OR value_1 = '13') (value_1 = '5' OR value_1 = '13')
GROUP BY user_id GROUP BY
HAVING count(distinct value_1) = 2 user_id
HAVING
count(distinct value_1) = 2
) as a ) as a
LEFT JOIN ( LEFT JOIN (
SELECT SELECT
@ -777,10 +818,13 @@ FROM (
users_table users_table
WHERE WHERE
(value_1 = '3') (value_1 = '3')
GROUP BY user_id) AS b GROUP BY
user_id) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NULL WHERE
GROUP BY a.user_id; b.user_id IS NULL
GROUP BY
a.user_id;
subquery_count subquery_count
---------------- ----------------
1 1
@ -849,9 +893,11 @@ FROM (
ORDER BY time ORDER BY time
LIMIT 1 LIMIT 1
) e5 ON true ) e5 ON true
where e1.user_id = 1 WHERE
group by e1.user_id e1.user_id = 1
limit 1; GROUP BY
e1.user_id
LIMIT 1;
user_id | viewed_homepage | use_demo | entered_credit_card | submit_card_info | see_bought_screen user_id | viewed_homepage | use_demo | entered_credit_card | submit_card_info | see_bought_screen
---------+-----------------+----------+---------------------+------------------+------------------- ---------+-----------------+----------+---------------------+------------------+-------------------
1 | 1 | | | | 1 | 1 | | | |
@ -1021,8 +1067,10 @@ FROM (
users_table users_table
WHERE WHERE
(value_1 > 5) (value_1 > 5)
GROUP BY user_id GROUP BY
HAVING count(distinct value_1) > 88 user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN ( LEFT JOIN (
SELECT SELECT
@ -1032,9 +1080,12 @@ FROM (
WHERE WHERE
(value_1 > 3)) AS b (value_1 > 3)) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
ORDER BY avg(b.value_3), 2, 1 GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5; LIMIT 5;
user_id | subquery_avg user_id | subquery_avg
---------+---------------------- ---------+----------------------
@ -1045,7 +1096,7 @@ LIMIT 5;
77 | 449.9313725490196078 77 | 449.9313725490196078
(5 rows) (5 rows)
-- add having -- add having to the same query
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM ( FROM (
SELECT SELECT
@ -1065,10 +1116,14 @@ FROM (
WHERE WHERE
(value_1 > 3)) AS b (value_1 > 3)) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
HAVING sum(b.value_3) > 50000 GROUP BY
ORDER BY avg(b.value_3), 2, 1 a.user_id
HAVING
sum(b.value_3) > 50000
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5; LIMIT 5;
user_id | subquery_avg user_id | subquery_avg
---------+---------------------- ---------+----------------------
@ -1082,21 +1137,33 @@ LIMIT 5;
-- avg on the value_3 is not a resjunk -- avg on the value_3 is not a resjunk
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3) SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT user_id, value_2, value_3 (
FROM users_table SELECT
WHERE (value_1 > 3) user_id, value_2, value_3
FROM
users_table
WHERE
(value_1 > 3)
) AS b ) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
ORDER BY avg(b.value_3) DESC, 2, 1 GROUP BY
a.user_id
ORDER BY
avg(b.value_3) DESC, 2, 1
LIMIT 5; LIMIT 5;
user_id | subquery_avg | avg user_id | subquery_avg | avg
---------+----------------------+------------------ ---------+----------------------+------------------
@ -1113,18 +1180,25 @@ SELECT u.user_id, sub.value_2, sub.value_3, COUNT(e2.user_id) counts
FROM FROM
users_table u users_table u
LEFT OUTER JOIN LATERAL LEFT OUTER JOIN LATERAL
(SELECT * (SELECT
FROM events_table e1 *
WHERE e1.user_id = u.user_id FROM
ORDER BY e1.value_3 DESC events_table e1
WHERE
e1.user_id = u.user_id
ORDER BY
e1.value_3 DESC
LIMIT 1 LIMIT 1
) sub ) sub
ON true ON true
LEFT OUTER JOIN events_table e2 LEFT OUTER JOIN events_table e2
ON e2.user_id = sub.user_id ON e2.user_id = sub.user_id
WHERE e2.value_2 > 10 and e2.value_2 < 50 AND u.value_2 > 10 and u.value_2 < 50 WHERE
GROUP BY u.user_id, sub.value_2, sub.value_3 e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50
ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC GROUP BY
u.user_id, sub.value_2, sub.value_3
ORDER BY
4 DESC, 1 DESC, 2 ASC, 3 ASC
LIMIT 10; LIMIT 10;
user_id | value_2 | value_3 | counts user_id | value_2 | value_3 | counts
---------+---------+---------+-------- ---------+---------+---------+--------
@ -1146,12 +1220,16 @@ SELECT
count(*) as users_count count(*) as users_count
FROM events_table FROM events_table
JOIN JOIN
(SELECT DISTINCT user_id (SELECT
FROM users_table DISTINCT user_id
FROM
users_table
) as distinct_users ) as distinct_users
ON distinct_users.user_id = events_table.user_id ON distinct_users.user_id = events_table.user_id
GROUP BY distinct_users.user_id GROUP BY
ORDER BY users_count desc, avg_type DESC distinct_users.user_id
ORDER BY
users_count desc, avg_type DESC
LIMIT 5; LIMIT 5;
avg_type | users_count avg_type | users_count
----------------------+------------- ----------------------+-------------
@ -1170,13 +1248,17 @@ FROM events_table
JOIN JOIN
(SELECT distinct_users.user_id, count(1) as ct (SELECT distinct_users.user_id, count(1) as ct
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
FROM
users_table
) as distinct_users ) as distinct_users
GROUP BY distinct_users.user_id GROUP BY
distinct_users.user_id
) as users_count ) as users_count
ON users_count.user_id = events_table.user_id ON users_count.user_id = events_table.user_id
ORDER BY users_count.ct desc, event_type DESC ORDER BY
users_count.ct desc, event_type DESC
LIMIT 5; LIMIT 5;
event_type | ct event_type | ct
------------+----- ------------+-----
@ -1190,17 +1272,25 @@ LIMIT 5;
--- now, test (subquery JOIN subquery) --- now, test (subquery JOIN subquery)
SELECT n1.user_id, count_1, total_count SELECT n1.user_id, count_1, total_count
FROM FROM
(SELECT user_id, count(1) as count_1 (SELECT
FROM users_table user_id, count(1) as count_1
GROUP BY user_id FROM
users_table
GROUP BY
user_id
) n1 ) n1
INNER JOIN INNER JOIN
(SELECT user_id, count(1) as total_count (
FROM events_table SELECT
GROUP BY user_id, event_type user_id, count(1) as total_count
FROM
events_table
GROUP BY
user_id, event_type
) n2 ) n2
ON (n2.user_id = n1.user_id) ON (n2.user_id = n1.user_id)
ORDER BY total_count DESC, count_1 DESC, 1 DESC ORDER BY
total_count DESC, count_1 DESC, 1 DESC
LIMIT 10; LIMIT 10;
user_id | count_1 | total_count user_id | count_1 | total_count
---------+---------+------------- ---------+---------+-------------
@ -1218,17 +1308,26 @@ LIMIT 10;
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT DISTINCT ON (user_id) user_id, value_2, value_3 (SELECT
FROM users_table DISTINCT ON (user_id) user_id, value_2, value_3
WHERE (value_1 > 3) FROM
ORDER BY 1,2,3 users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b ) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE b.user_id IS NOT NULL
@ -1248,17 +1347,26 @@ LIMIT 5;
-- when used in target list -- when used in target list
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT DISTINCT ON (value_2) value_2 , user_id, value_3 (SELECT
FROM users_table DISTINCT ON (value_2) value_2 , user_id, value_3
WHERE (value_1 > 3) FROM
ORDER BY 1,2,3 users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b ) AS b
USING (user_id) USING (user_id)
GROUP BY user_id; GROUP BY user_id;
@ -1266,22 +1374,34 @@ ERROR: cannot push down this subquery
DETAIL: Distinct on columns without partition column is currently unsupported DETAIL: Distinct on columns without partition column is currently unsupported
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3 (SELECT
FROM users_table DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
WHERE (value_1 > 3) FROM
ORDER BY 1,2,3 users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b ) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
ORDER BY avg(b.value_3), 2, 1 GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5; LIMIT 5;
user_id | subquery_avg user_id | subquery_avg
---------+---------------------- ---------+----------------------
@ -1297,22 +1417,30 @@ FROM
(SELECT * (SELECT *
FROM FROM
( (
(SELECT event_type, user_id as a_user_id FROM events_table) AS a (SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN JOIN
(SELECT (SELECT
ma.user_id AS user_id, ma.value_2 AS value_2, ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma FROM
WHERE (ma.value_2 > 100) users_table AS ma
ORDER BY prob DESC, user_id DESC WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS ma ) AS ma
ON (a.a_user_id = ma.user_id) ON (a.a_user_id = ma.user_id)
) AS inner_sub ) AS inner_sub
ORDER BY prob DESC, user_id DESC ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS outer_sub ) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10; LIMIT 10;
user_id | event_type user_id | event_type
---------+------------ ---------+------------
@ -1332,18 +1460,25 @@ LIMIT 10;
-- ordering difference in the previous one's inner query -- ordering difference in the previous one's inner query
SELECT user_id, event_type SELECT user_id, event_type
FROM FROM
(SELECT event_type, user_id as a_user_id FROM events_table) AS a (SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN JOIN
(SELECT (SELECT
ma.user_id AS user_id, ma.value_2 AS value_2, ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma FROM
WHERE (ma.value_2 > 100) users_table AS ma
ORDER BY prob DESC, user_id DESC WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS ma ) AS ma
ON (a.a_user_id = ma.user_id) ON (a.a_user_id = ma.user_id)
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10; LIMIT 10;
user_id | event_type user_id | event_type
---------+------------ ---------+------------
@ -1365,22 +1500,31 @@ FROM
(SELECT * (SELECT *
FROM FROM
( (
(SELECT event_type, user_id as a_user_id FROM events_table) AS a (SELECT
event_type, user_id as a_user_id
FROM
events_table
) AS a
JOIN JOIN
(SELECT (SELECT
ma.user_id AS user_id, ma.value_2 AS value_2, ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma FROM
WHERE (ma.value_2 > 100) users_table AS ma
ORDER BY prob DESC, user_id DESC WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS ma ) AS ma
ON (a.a_user_id = ma.user_id) ON (a.a_user_id = ma.user_id)
) AS inner_sub ) AS inner_sub
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS outer_sub ) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10; LIMIT 10;
user_id | event_type user_id | event_type
---------+------------ ---------+------------
@ -1423,80 +1567,63 @@ CREATE OR REPLACE FUNCTION array_index(ANYARRAY, ANYELEMENT)
SELECT * SELECT *
FROM FROM
(SELECT * (SELECT *
FROM FROM (
( (SELECT user_id AS user_id_e,
(SELECT event_type AS event_type_e
user_id AS user_id_e, FROM events_table ) AS ma_e
event_type as event_type_e
FROM
events_table
) AS ma_e
JOIN JOIN
(SELECT (SELECT value_2,
value_2,
value_3, value_3,
user_id user_id
FROM FROM
(SELECT * (SELECT *
FROM FROM (
(
(SELECT user_id_p AS user_id (SELECT user_id_p AS user_id
FROM FROM
(SELECT * (SELECT *
FROM (
(SELECT
user_id AS user_id_p
FROM FROM
( events_table
(SELECT user_id AS user_id_p WHERE
FROM events_table (event_type IN (1,2,3,4,5)) ) AS ma_p
WHERE (event_type IN (1, 2, 3, 4, 5))
) AS ma_p
JOIN
(SELECT user_id AS user_id_a
FROM users_table
WHERE (value_2 % 5 = 1)
) AS a
ON (a.user_id_a = ma_p.user_id_p)
)
) AS a_ma_p
) AS inner_filter_q
JOIN JOIN
(SELECT (SELECT
value_2, user_id AS user_id_a
value_3, FROM
user_id AS user_id_ck users_table
FROM events_table WHERE
WHERE event_type = ANY(ARRAY [10, 11, 12]) (value_2 % 5 = 1) ) AS a
ON (a.user_id_a = ma_p.user_id_p) ) ) AS a_ma_p ) AS inner_filter_q
JOIN
(SELECT
value_2, value_3, user_id AS user_id_ck
FROM
events_table
WHERE
event_type = ANY(ARRAY [10, 11, 12])
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC, LIMIT 10 )
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) )
LIMIT 10 AS inner_sub_q
) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC, LIMIT 10 )
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC AS outer_sub_q
LIMIT 10
) AS outer_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id DESC, LIMIT 10)
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC AS inner_search_q
LIMIT 10) AS inner_search_q ON (ma_e.user_id_e = inner_search_q.user_id) )
ON (ma_e.user_id_e = inner_search_q.user_id) AS outer_inner_sub_q
) AS outer_inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
user_id DESC, LIMIT 10)
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, AS outer_outer_sub_q
event_type_e DESC
LIMIT 10) AS outer_outer_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
LIMIT 10; LIMIT 10;
user_id_e | event_type_e | value_2 | value_3 | user_id user_id_e | event_type_e | value_2 | value_3 | user_id
-----------+--------------+---------+---------+--------- -----------+--------------+---------+---------+---------
@ -1518,33 +1645,39 @@ SELECT *
FROM FROM
( (
(SELECT (SELECT
user_id AS user_id_e, user_id AS user_id_e, event_type as event_type_e
event_type as event_type_e
FROM FROM
events_table events_table
) AS ma_e ) AS ma_e
JOIN JOIN
(SELECT (SELECT
value_2, value_2, value_3, user_id
value_3,
user_id
FROM FROM
(SELECT * (SELECT
*
FROM FROM
( (
(SELECT user_id_p AS user_id (SELECT
user_id_p AS user_id
FROM FROM
(SELECT * (SELECT
*
FROM FROM
( (
(SELECT user_id AS user_id_p (SELECT
FROM events_table user_id AS user_id_p
WHERE (event_type IN (1, 2, 3, 4, 5)) FROM
events_table
WHERE
(event_type IN (1, 2, 3, 4, 5))
) AS ma_p ) AS ma_p
JOIN JOIN
(SELECT user_id AS user_id_a (SELECT
FROM users_table user_id AS user_id_a
WHERE (value_2 % 5 = 1) FROM
users_table
WHERE
(value_2 % 5 = 1)
) AS a ) AS a
ON (a.user_id_a = ma_p.user_id_p) ON (a.user_id_a = ma_p.user_id_p)
) )
@ -1552,37 +1685,28 @@ FROM
) AS inner_filter_q ) AS inner_filter_q
JOIN JOIN
(SELECT (SELECT
value_2, value_2, value_3, user_id AS user_id_ck
value_3, FROM
user_id AS user_id_ck events_table
FROM events_table WHERE
WHERE event_type = ANY(ARRAY [10, 11, 12]) event_type = ANY(ARRAY [10, 11, 12])
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 LIMIT 10
) AS ma_ck ) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id) ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q ) AS inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 LIMIT 10
) AS outer_sub_q ) AS outer_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10) AS inner_search_q LIMIT 10) AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id) ON (ma_e.user_id_e = inner_search_q.user_id)
) AS outer_inner_sub_q ) AS outer_inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
LIMIT 10; LIMIT 10;
user_id_e | event_type_e | value_2 | value_3 | user_id user_id_e | event_type_e | value_2 | value_3 | user_id
-----------+--------------+---------+---------+--------- -----------+--------------+---------+---------+---------
@ -1679,11 +1803,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q
@ -1705,11 +1831,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q
@ -1731,11 +1859,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q
@ -1757,11 +1887,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q

File diff suppressed because it is too large Load Diff

View File

@ -191,32 +191,40 @@ FROM (
( SELECT user_id, ( SELECT user_id,
sum(counter) sum(counter)
FROM FROM
( SELECT user_id, (SELECT
sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM users_table FROM
GROUP BY user_id users_table
GROUP BY
user_id
UNION UNION
SELECT user_id, SELECT
sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM events_table FROM
GROUP BY user_id ) user_id_1 events_table
GROUP BY user_id) GROUP BY
user_id) user_id_1
GROUP BY
user_id)
UNION UNION
( SELECT user_id, (SELECT
sum(counter) user_id, sum(counter)
FROM FROM
(SELECT (SELECT
user_id, sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM users_table FROM
GROUP BY user_id users_table
GROUP BY
user_id
UNION UNION
SELECT user_id, sum(value_2) AS counter SELECT
user_id, sum(value_2) AS counter
FROM events_table FROM
GROUP BY user_id) user_id_2 events_table
GROUP BY user_id)) AS ftop GROUP BY
user_id) user_id_2
GROUP BY
user_id)) AS ftop
ORDER BY 2 DESC, 1 DESC ORDER BY 2 DESC, 1 DESC
LIMIT 5; LIMIT 5;
user_id | sum user_id | sum
@ -233,40 +241,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT *, random() ( SELECT *, random()
FROM FROM
( SELECT "t"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION UNION
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION UNION
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", "events"."time", 2 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 2 AS event
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION UNION
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", "events"."time", 3 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 3 AS event
WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
) as final_query ) as final_query
GROUP BY types GROUP BY types
@ -285,34 +298,39 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
(SELECT *, random() (SELECT *, random()
FROM FROM
( SELECT "t"."user_id", (SELECT
"t"."time", "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", (SELECT
min("t1"."time") AS "time", "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM( FROM(
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)) WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
) as final_query ) as final_query
GROUP BY types GROUP BY types
@ -328,35 +346,37 @@ ORDER BY types;
-- again excatly the same query with top level wrapper removed -- again excatly the same query with top level wrapper removed
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT "t"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) WHERE
) event_type IN (10, 11, 12, 13, 14, 15))
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types GROUP BY types
ORDER BY types; ORDER BY types;
@ -375,27 +395,36 @@ FROM
FROM FROM
( SELECT "t1"."user_id" ( SELECT "t1"."user_id"
FROM ( FROM (
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) WHERE
) event_type IN (10, 11, 12, 13, 14, 15))
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
) AS t) "q" ORDER BY 1 LIMIT 5; WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
) AS t) "q"
ORDER BY 1
LIMIT 5;
user_id user_id
--------- ---------
0 0
@ -408,35 +437,37 @@ FROM
-- a very similar query UNION ALL -- a very similar query UNION ALL
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT "t"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) WHERE
) event_type IN (10, 11, 12, 13, 14, 15))
UNION ALL UNION ALL
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION ALL UNION ALL
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION ALL UNION ALL
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types GROUP BY types
ORDER BY types; ORDER BY types;
@ -701,32 +732,40 @@ FROM (
( SELECT user_id, ( SELECT user_id,
sum(counter) sum(counter)
FROM FROM
( SELECT user_id, (SELECT
sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM users_table
GROUP BY user_id
UNION
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id ) user_id_1
GROUP BY user_id)
UNION
( SELECT user_id,
sum(counter)
FROM FROM
( SELECT sum(value_2) AS counter, users_table
GROUP BY
user_id user_id
FROM users_table
GROUP BY user_id
UNION UNION
SELECT user_id, SELECT
sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM events_table FROM
GROUP BY user_id) user_id_2 events_table
GROUP BY user_id)) AS ftop; GROUP BY
user_id) user_id_1
GROUP BY
user_id)
UNION
(SELECT
user_id, sum(counter)
FROM
(SELECT
sum(value_2) AS counter, user_id
FROM
users_table
GROUP BY
user_id
UNION
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_2
GROUP BY
user_id)) AS ftop;
ERROR: cannot pushdown the subquery since all leaves of the UNION does not include partition key at the same position ERROR: cannot pushdown the subquery since all leaves of the UNION does not include partition key at the same position
DETAIL: Each leaf query of the UNION should return partition key at the same position on its target list. DETAIL: Each leaf query of the UNION should return partition key at the same position on its target list.
-- some UNION all queries that are going to be pulled up -- some UNION all queries that are going to be pulled up
@ -815,31 +854,46 @@ ORDER BY 1 DESC, 2 DESC
LIMIT 5; LIMIT 5;
ERROR: cannot push down this subquery ERROR: cannot push down this subquery
DETAIL: Subqueries without relations are unsupported DETAIL: Subqueries without relations are unsupported
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT "t"."user_id", ( SELECT *, random()
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
min("t1"."time") AS "time", FROM
array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT "events"."user_id", "events"."time", 0 AS event (SELECT *
FROM events_table as "events" FROM
WHERE event_type IN (10, 11, 12, 13, 14, 15) (SELECT
) "events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT *
FROM events_table as "events" FROM
WHERE event_type IN (15, 16, 17, 18, 19) ) (SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION UNION
(SELECT "events"."user_id", "events"."time", 2 AS event (SELECT *
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) (SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION UNION
(SELECT 1, now(), 3 AS event)) t1 (SELECT *
FROM
(SELECT 1, now(), 3 AS event) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types GROUP BY types
ORDER BY types; ORDER BY types;
ERROR: cannot push down this subquery ERROR: cannot push down this subquery

View File

@ -325,7 +325,12 @@ ORDER BY
( (
SELECT SELECT
users_table.user_id, users_table.user_id,
CASE WHEN events_table.event_type > 10 AND events_table.event_type < 12 THEN 'action=>1' ELSE 'action=>2' END AS event, CASE
WHEN
events_table.event_type > 10 AND events_table.event_type < 12
THEN 'action=>1'
ELSE 'action=>2'
END AS event,
events_table.time events_table.time
FROM FROM
users_table, users_table,
@ -522,18 +527,31 @@ SELECT user_id,
------------------------------------ ------------------------------------
SELECT user_id, value_1 from SELECT user_id, value_1 from
( (
SELECT user_id, value_1 From users_table SELECT
WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1 user_id, value_1 From users_table
WHERE
value_2 > 100 and user_id = 15
GROUP BY
value_1, user_id
HAVING
count(*) > 1
) AS a ) AS a
ORDER BY user_id ASC, value_1 ASC; ORDER BY
user_id ASC, value_1 ASC;
-- same query with additional filter to make it not router plannable -- same query with additional filter to make it not router plannable
SELECT user_id, value_1 from SELECT user_id, value_1 from
( (
SELECT user_id, value_1 From users_table SELECT
WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1 user_id, value_1 From users_table
WHERE
value_2 > 100 and (user_id = 15 OR user_id = 16)
GROUP BY
value_1, user_id
HAVING count(*) > 1
) AS a ) AS a
ORDER BY user_id ASC, value_1 ASC; ORDER BY
user_id ASC, value_1 ASC;
------------------------------------ ------------------------------------
-- Find me all users_table who has done some event and has filters -- Find me all users_table who has done some event and has filters
@ -542,12 +560,15 @@ ORDER BY user_id ASC, value_1 ASC;
SELECT user_id SELECT user_id
FROM events_table FROM events_table
WHERE WHERE
event_type = 16 AND value_2 > 50 event_type = 16 AND value_2 > 50 AND
AND user_id IN user_id IN
(SELECT user_id (SELECT
FROM users_table user_id
FROM
users_table
WHERE WHERE
value_1 = 15 AND value_2 > 25); value_1 = 15 AND value_2 > 25
);
------------------------------------ ------------------------------------
-- Which events_table did people who has done some specific events_table -- Which events_table did people who has done some specific events_table
@ -566,10 +587,15 @@ SELECT user_id FROM
user_id user_id
FROM FROM
events_table events_table
WHERE event_type = 901 WHERE
GROUP BY user_id HAVING count(*) > 3 event_type = 901
GROUP BY
user_id
HAVING
count(*) > 3
) AS a ) AS a
ORDER BY user_id; ORDER BY
user_id;
------------------------------------ ------------------------------------
-- Find my assets that have the highest probability and fetch their metadata -- Find my assets that have the highest probability and fetch their metadata
@ -588,7 +614,8 @@ FROM
short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50 short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
) temp ) temp
ON users_table.user_id = temp.user_id ON users_table.user_id = temp.user_id
WHERE users_table.value_1 < 50; WHERE
users_table.value_1 < 50;
-- get some statistics from the aggregated results to ensure the results are correct -- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets; SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
@ -599,13 +626,17 @@ DROP TABLE assets;
-- original query that fails -- original query that fails
SELECT count(*) FROM SELECT count(*) FROM
( (
SELECT user_id SELECT
FROM users_table user_id
WHERE (value_1 = '5' FROM
OR value_1 = '13') users_table
AND user_id NOT IN (select user_id from users_table where value_1 = '3') WHERE
GROUP BY user_id (value_1 = '5' OR value_1 = '13') AND
HAVING count(distinct value_1) = 2 user_id NOT IN (select user_id from users_table where value_1 = '3')
GROUP BY
user_id
HAVING
count(distinct value_1) = 2
) as foo; ) as foo;
-- previous push down query -- previous push down query
@ -617,8 +648,10 @@ SELECT subquery_count FROM
users_table users_table
WHERE WHERE
(value_1 = '5' OR value_1 = '13') (value_1 = '5' OR value_1 = '13')
GROUP BY user_id GROUP BY
HAVING count(distinct value_1) = 2) as a user_id
HAVING
count(distinct value_1) = 2) as a
LEFT JOIN LEFT JOIN
(SELECT (SELECT
user_id user_id
@ -626,8 +659,14 @@ SELECT subquery_count FROM
users_table users_table
WHERE WHERE
(value_1 = '3') (value_1 = '3')
GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL GROUP BY
GROUP BY a.user_id) AS inner_subquery; user_id) as b
ON a.user_id = b.user_id
WHERE
b.user_id IS NULL
GROUP BY
a.user_id
) AS inner_subquery;
-- new pushdown query without single range table entry at top requirement -- new pushdown query without single range table entry at top requirement
SELECT count(*) as subquery_count SELECT count(*) as subquery_count
@ -638,8 +677,10 @@ FROM (
users_table users_table
WHERE WHERE
(value_1 = '5' OR value_1 = '13') (value_1 = '5' OR value_1 = '13')
GROUP BY user_id GROUP BY
HAVING count(distinct value_1) = 2 user_id
HAVING
count(distinct value_1) = 2
) as a ) as a
LEFT JOIN ( LEFT JOIN (
SELECT SELECT
@ -648,10 +689,13 @@ FROM (
users_table users_table
WHERE WHERE
(value_1 = '3') (value_1 = '3')
GROUP BY user_id) AS b GROUP BY
user_id) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NULL WHERE
GROUP BY a.user_id; b.user_id IS NULL
GROUP BY
a.user_id;
-- multi-subquery-join -- multi-subquery-join
-- The first query has filters on partion column to make it router plannable -- The first query has filters on partion column to make it router plannable
@ -716,9 +760,11 @@ FROM (
ORDER BY time ORDER BY time
LIMIT 1 LIMIT 1
) e5 ON true ) e5 ON true
where e1.user_id = 1 WHERE
group by e1.user_id e1.user_id = 1
limit 1; GROUP BY
e1.user_id
LIMIT 1;
-- Same query without all limitations -- Same query without all limitations
SELECT SELECT
@ -853,8 +899,10 @@ FROM (
users_table users_table
WHERE WHERE
(value_1 > 5) (value_1 > 5)
GROUP BY user_id GROUP BY
HAVING count(distinct value_1) > 88 user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN ( LEFT JOIN (
SELECT SELECT
@ -864,12 +912,15 @@ FROM (
WHERE WHERE
(value_1 > 3)) AS b (value_1 > 3)) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
ORDER BY avg(b.value_3), 2, 1 GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5; LIMIT 5;
-- add having -- add having to the same query
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM ( FROM (
SELECT SELECT
@ -889,30 +940,46 @@ FROM (
WHERE WHERE
(value_1 > 3)) AS b (value_1 > 3)) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
HAVING sum(b.value_3) > 50000 GROUP BY
ORDER BY avg(b.value_3), 2, 1 a.user_id
HAVING
sum(b.value_3) > 50000
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5; LIMIT 5;
-- avg on the value_3 is not a resjunk -- avg on the value_3 is not a resjunk
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3) SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT user_id, value_2, value_3 (
FROM users_table SELECT
WHERE (value_1 > 3) user_id, value_2, value_3
FROM
users_table
WHERE
(value_1 > 3)
) AS b ) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
ORDER BY avg(b.value_3) DESC, 2, 1 GROUP BY
a.user_id
ORDER BY
avg(b.value_3) DESC, 2, 1
LIMIT 5; LIMIT 5;
-- a powerful query structure that analyzes users/events -- a powerful query structure that analyzes users/events
@ -921,18 +988,25 @@ SELECT u.user_id, sub.value_2, sub.value_3, COUNT(e2.user_id) counts
FROM FROM
users_table u users_table u
LEFT OUTER JOIN LATERAL LEFT OUTER JOIN LATERAL
(SELECT * (SELECT
FROM events_table e1 *
WHERE e1.user_id = u.user_id FROM
ORDER BY e1.value_3 DESC events_table e1
WHERE
e1.user_id = u.user_id
ORDER BY
e1.value_3 DESC
LIMIT 1 LIMIT 1
) sub ) sub
ON true ON true
LEFT OUTER JOIN events_table e2 LEFT OUTER JOIN events_table e2
ON e2.user_id = sub.user_id ON e2.user_id = sub.user_id
WHERE e2.value_2 > 10 and e2.value_2 < 50 AND u.value_2 > 10 and u.value_2 < 50 WHERE
GROUP BY u.user_id, sub.value_2, sub.value_3 e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50
ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC GROUP BY
u.user_id, sub.value_2, sub.value_3
ORDER BY
4 DESC, 1 DESC, 2 ASC, 3 ASC
LIMIT 10; LIMIT 10;
-- distinct users joined with events -- distinct users joined with events
@ -941,12 +1015,16 @@ SELECT
count(*) as users_count count(*) as users_count
FROM events_table FROM events_table
JOIN JOIN
(SELECT DISTINCT user_id (SELECT
FROM users_table DISTINCT user_id
FROM
users_table
) as distinct_users ) as distinct_users
ON distinct_users.user_id = events_table.user_id ON distinct_users.user_id = events_table.user_id
GROUP BY distinct_users.user_id GROUP BY
ORDER BY users_count desc, avg_type DESC distinct_users.user_id
ORDER BY
users_count desc, avg_type DESC
LIMIT 5; LIMIT 5;
-- reduce the data set, aggregate and join -- reduce the data set, aggregate and join
@ -957,44 +1035,65 @@ FROM events_table
JOIN JOIN
(SELECT distinct_users.user_id, count(1) as ct (SELECT distinct_users.user_id, count(1) as ct
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
FROM
users_table
) as distinct_users ) as distinct_users
GROUP BY distinct_users.user_id GROUP BY
distinct_users.user_id
) as users_count ) as users_count
ON users_count.user_id = events_table.user_id ON users_count.user_id = events_table.user_id
ORDER BY users_count.ct desc, event_type DESC ORDER BY
users_count.ct desc, event_type DESC
LIMIT 5; LIMIT 5;
--- now, test (subquery JOIN subquery) --- now, test (subquery JOIN subquery)
SELECT n1.user_id, count_1, total_count SELECT n1.user_id, count_1, total_count
FROM FROM
(SELECT user_id, count(1) as count_1 (SELECT
FROM users_table user_id, count(1) as count_1
GROUP BY user_id FROM
users_table
GROUP BY
user_id
) n1 ) n1
INNER JOIN INNER JOIN
(SELECT user_id, count(1) as total_count (
FROM events_table SELECT
GROUP BY user_id, event_type user_id, count(1) as total_count
FROM
events_table
GROUP BY
user_id, event_type
) n2 ) n2
ON (n2.user_id = n1.user_id) ON (n2.user_id = n1.user_id)
ORDER BY total_count DESC, count_1 DESC, 1 DESC ORDER BY
total_count DESC, count_1 DESC, 1 DESC
LIMIT 10; LIMIT 10;
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT DISTINCT ON (user_id) user_id, value_2, value_3 (SELECT
FROM users_table DISTINCT ON (user_id) user_id, value_2, value_3
WHERE (value_1 > 3) FROM
ORDER BY 1,2,3 users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b ) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE b.user_id IS NOT NULL
@ -1006,39 +1105,60 @@ LIMIT 5;
-- when used in target list -- when used in target list
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT DISTINCT ON (value_2) value_2 , user_id, value_3 (SELECT
FROM users_table DISTINCT ON (value_2) value_2 , user_id, value_3
WHERE (value_1 > 3) FROM
ORDER BY 1,2,3 users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b ) AS b
USING (user_id) USING (user_id)
GROUP BY user_id; GROUP BY user_id;
SELECT a.user_id, avg(b.value_2) as subquery_avg SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM FROM
(SELECT user_id (SELECT
FROM users_table user_id
WHERE (value_1 > 5) FROM
GROUP BY user_id users_table
HAVING count(distinct value_1) > 88 WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a ) as a
LEFT JOIN LEFT JOIN
(SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3 (SELECT
FROM users_table DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
WHERE (value_1 > 3) FROM
ORDER BY 1,2,3 users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b ) AS b
ON a.user_id = b.user_id ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL WHERE
GROUP BY a.user_id b.user_id IS NOT NULL
ORDER BY avg(b.value_3), 2, 1 GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5; LIMIT 5;
SELECT user_id, event_type SELECT user_id, event_type
@ -1046,40 +1166,55 @@ FROM
(SELECT * (SELECT *
FROM FROM
( (
(SELECT event_type, user_id as a_user_id FROM events_table) AS a (SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN JOIN
(SELECT (SELECT
ma.user_id AS user_id, ma.value_2 AS value_2, ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma FROM
WHERE (ma.value_2 > 100) users_table AS ma
ORDER BY prob DESC, user_id DESC WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS ma ) AS ma
ON (a.a_user_id = ma.user_id) ON (a.a_user_id = ma.user_id)
) AS inner_sub ) AS inner_sub
ORDER BY prob DESC, user_id DESC ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS outer_sub ) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10; LIMIT 10;
-- very similar query but produces different result due to -- very similar query but produces different result due to
-- ordering difference in the previous one's inner query -- ordering difference in the previous one's inner query
SELECT user_id, event_type SELECT user_id, event_type
FROM FROM
(SELECT event_type, user_id as a_user_id FROM events_table) AS a (SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN JOIN
(SELECT (SELECT
ma.user_id AS user_id, ma.value_2 AS value_2, ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma FROM
WHERE (ma.value_2 > 100) users_table AS ma
ORDER BY prob DESC, user_id DESC WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS ma ) AS ma
ON (a.a_user_id = ma.user_id) ON (a.a_user_id = ma.user_id)
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10; LIMIT 10;
-- now they produce the same result when ordering fixed in 'outer_sub' -- now they produce the same result when ordering fixed in 'outer_sub'
@ -1088,22 +1223,31 @@ FROM
(SELECT * (SELECT *
FROM FROM
( (
(SELECT event_type, user_id as a_user_id FROM events_table) AS a (SELECT
event_type, user_id as a_user_id
FROM
events_table
) AS a
JOIN JOIN
(SELECT (SELECT
ma.user_id AS user_id, ma.value_2 AS value_2, ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob (GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma FROM
WHERE (ma.value_2 > 100) users_table AS ma
ORDER BY prob DESC, user_id DESC WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS ma ) AS ma
ON (a.a_user_id = ma.user_id) ON (a.a_user_id = ma.user_id)
) AS inner_sub ) AS inner_sub
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10 LIMIT 10
) AS outer_sub ) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10; LIMIT 10;
-- this is one complex join query derived from a user's production query -- this is one complex join query derived from a user's production query
@ -1129,80 +1273,63 @@ CREATE OR REPLACE FUNCTION array_index(ANYARRAY, ANYELEMENT)
SELECT * SELECT *
FROM FROM
(SELECT * (SELECT *
FROM FROM (
( (SELECT user_id AS user_id_e,
(SELECT event_type AS event_type_e
user_id AS user_id_e, FROM events_table ) AS ma_e
event_type as event_type_e
FROM
events_table
) AS ma_e
JOIN JOIN
(SELECT (SELECT value_2,
value_2,
value_3, value_3,
user_id user_id
FROM FROM
(SELECT * (SELECT *
FROM FROM (
(
(SELECT user_id_p AS user_id (SELECT user_id_p AS user_id
FROM FROM
(SELECT * (SELECT *
FROM (
(SELECT
user_id AS user_id_p
FROM FROM
( events_table
(SELECT user_id AS user_id_p WHERE
FROM events_table (event_type IN (1,2,3,4,5)) ) AS ma_p
WHERE (event_type IN (1, 2, 3, 4, 5))
) AS ma_p
JOIN
(SELECT user_id AS user_id_a
FROM users_table
WHERE (value_2 % 5 = 1)
) AS a
ON (a.user_id_a = ma_p.user_id_p)
)
) AS a_ma_p
) AS inner_filter_q
JOIN JOIN
(SELECT (SELECT
value_2, user_id AS user_id_a
value_3, FROM
user_id AS user_id_ck users_table
FROM events_table WHERE
WHERE event_type = ANY(ARRAY [10, 11, 12]) (value_2 % 5 = 1) ) AS a
ON (a.user_id_a = ma_p.user_id_p) ) ) AS a_ma_p ) AS inner_filter_q
JOIN
(SELECT
value_2, value_3, user_id AS user_id_ck
FROM
events_table
WHERE
event_type = ANY(ARRAY [10, 11, 12])
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC, LIMIT 10 )
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) )
LIMIT 10 AS inner_sub_q
) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC, LIMIT 10 )
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC AS outer_sub_q
LIMIT 10
) AS outer_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id DESC, LIMIT 10)
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC AS inner_search_q
LIMIT 10) AS inner_search_q ON (ma_e.user_id_e = inner_search_q.user_id) )
ON (ma_e.user_id_e = inner_search_q.user_id) AS outer_inner_sub_q
) AS outer_inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
user_id DESC, LIMIT 10)
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, AS outer_outer_sub_q
event_type_e DESC
LIMIT 10) AS outer_outer_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
LIMIT 10; LIMIT 10;
-- top level select * is removed now there is -- top level select * is removed now there is
@ -1211,33 +1338,39 @@ SELECT *
FROM FROM
( (
(SELECT (SELECT
user_id AS user_id_e, user_id AS user_id_e, event_type as event_type_e
event_type as event_type_e
FROM FROM
events_table events_table
) AS ma_e ) AS ma_e
JOIN JOIN
(SELECT (SELECT
value_2, value_2, value_3, user_id
value_3,
user_id
FROM FROM
(SELECT * (SELECT
*
FROM FROM
( (
(SELECT user_id_p AS user_id (SELECT
user_id_p AS user_id
FROM FROM
(SELECT * (SELECT
*
FROM FROM
( (
(SELECT user_id AS user_id_p (SELECT
FROM events_table user_id AS user_id_p
WHERE (event_type IN (1, 2, 3, 4, 5)) FROM
events_table
WHERE
(event_type IN (1, 2, 3, 4, 5))
) AS ma_p ) AS ma_p
JOIN JOIN
(SELECT user_id AS user_id_a (SELECT
FROM users_table user_id AS user_id_a
WHERE (value_2 % 5 = 1) FROM
users_table
WHERE
(value_2 % 5 = 1)
) AS a ) AS a
ON (a.user_id_a = ma_p.user_id_p) ON (a.user_id_a = ma_p.user_id_p)
) )
@ -1245,37 +1378,28 @@ FROM
) AS inner_filter_q ) AS inner_filter_q
JOIN JOIN
(SELECT (SELECT
value_2, value_2, value_3, user_id AS user_id_ck
value_3, FROM
user_id AS user_id_ck events_table
FROM events_table WHERE
WHERE event_type = ANY(ARRAY [10, 11, 12]) event_type = ANY(ARRAY [10, 11, 12])
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 LIMIT 10
) AS ma_ck ) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id) ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q ) AS inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 LIMIT 10
) AS outer_sub_q ) AS outer_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10) AS inner_search_q LIMIT 10) AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id) ON (ma_e.user_id_e = inner_search_q.user_id)
) AS outer_inner_sub_q ) AS outer_inner_sub_q
ORDER BY ORDER BY
value_3 ASC, value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
LIMIT 10; LIMIT 10;
@ -1354,11 +1478,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q
@ -1370,11 +1496,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q
@ -1392,11 +1520,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q
@ -1408,11 +1538,13 @@ SELECT user_id, array_length(events_table, 1)
FROM ( FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM ( FROM (
SELECT u.user_id, e.event_type::text AS event, e.time SELECT
FROM users_table AS u, u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e events_table AS e
WHERE u.user_id = e.user_id WHERE
AND e.event_type IN (100, 101, 102) u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t ) t
GROUP BY user_id GROUP BY user_id
) q ) q

File diff suppressed because it is too large Load Diff

View File

@ -123,34 +123,40 @@ FROM (
( SELECT user_id, ( SELECT user_id,
sum(counter) sum(counter)
FROM FROM
( SELECT user_id, (SELECT
sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM users_table FROM
GROUP BY user_id users_table
GROUP BY
user_id
UNION UNION
SELECT
SELECT user_id, user_id, sum(value_2) AS counter
sum(value_2) AS counter FROM
FROM events_table events_table
GROUP BY user_id ) user_id_1 GROUP BY
GROUP BY user_id) user_id) user_id_1
GROUP BY
user_id)
UNION UNION
( SELECT user_id, (SELECT
sum(counter) user_id, sum(counter)
FROM FROM
(SELECT (SELECT
user_id, sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM users_table FROM
GROUP BY user_id users_table
GROUP BY
user_id
UNION UNION
SELECT
SELECT user_id, sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM
FROM events_table events_table
GROUP BY user_id) user_id_2 GROUP BY
GROUP BY user_id)) AS ftop user_id) user_id_2
GROUP BY
user_id)) AS ftop
ORDER BY 2 DESC, 1 DESC ORDER BY 2 DESC, 1 DESC
LIMIT 5; LIMIT 5;
@ -159,40 +165,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT *, random() ( SELECT *, random()
FROM FROM
( SELECT "t"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1) WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION UNION
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION UNION
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", "events"."time", 2 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 2 AS event
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3) FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION UNION
(SELECT * (SELECT *
FROM FROM
(SELECT "events"."user_id", "events"."time", 3 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 3 AS event
WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1 FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
) as final_query ) as final_query
GROUP BY types GROUP BY types
@ -204,34 +215,39 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
(SELECT *, random() (SELECT *, random()
FROM FROM
( SELECT "t"."user_id", (SELECT
"t"."time", "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", (SELECT
min("t1"."time") AS "time", "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM( FROM(
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)) WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
) as final_query ) as final_query
GROUP BY types GROUP BY types
@ -240,35 +256,37 @@ ORDER BY types;
-- again excatly the same query with top level wrapper removed -- again excatly the same query with top level wrapper removed
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT "t"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) WHERE
) event_type IN (10, 11, 12, 13, 14, 15))
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types GROUP BY types
ORDER BY types; ORDER BY types;
@ -280,60 +298,71 @@ FROM
FROM FROM
( SELECT "t1"."user_id" ( SELECT "t1"."user_id"
FROM ( FROM (
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) WHERE
) event_type IN (10, 11, 12, 13, 14, 15))
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION UNION
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
) AS t) "q" ORDER BY 1 LIMIT 5; WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
) AS t) "q"
ORDER BY 1
LIMIT 5;
-- a very similar query UNION ALL -- a very similar query UNION ALL
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT "t"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT "events"."user_id", (SELECT
"events"."time", "events"."user_id", "events"."time", 0 AS event
0 AS event FROM
FROM events_table as "events" events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) WHERE
) event_type IN (10, 11, 12, 13, 14, 15))
UNION ALL UNION ALL
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT
FROM events_table as "events" "events"."user_id", "events"."time", 1 AS event
WHERE event_type IN (15, 16, 17, 18, 19) ) FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION ALL UNION ALL
(SELECT
(SELECT "events"."user_id", "events"."time", 2 AS event "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION ALL UNION ALL
(SELECT
(SELECT "events"."user_id", "events"."time", 3 AS event "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events" FROM
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1 events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types GROUP BY types
ORDER BY types; ORDER BY types;
@ -535,34 +564,41 @@ FROM (
( SELECT user_id, ( SELECT user_id,
sum(counter) sum(counter)
FROM FROM
( SELECT user_id, (SELECT
sum(value_2) AS counter user_id, sum(value_2) AS counter
FROM users_table
GROUP BY user_id
UNION
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id ) user_id_1
GROUP BY user_id)
UNION
( SELECT user_id,
sum(counter)
FROM FROM
( SELECT sum(value_2) AS counter, users_table
GROUP BY
user_id user_id
FROM users_table
GROUP BY user_id
UNION UNION
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_1
GROUP BY
user_id)
UNION
(SELECT
user_id, sum(counter)
FROM
(SELECT
sum(value_2) AS counter, user_id
FROM
users_table
GROUP BY
user_id
UNION
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_2
GROUP BY
user_id)) AS ftop;
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id) user_id_2
GROUP BY user_id)) AS ftop;
-- some UNION all queries that are going to be pulled up -- some UNION all queries that are going to be pulled up
SELECT SELECT
@ -644,31 +680,46 @@ FROM
ORDER BY 1 DESC, 2 DESC ORDER BY 1 DESC, 2 DESC
LIMIT 5; LIMIT 5;
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM FROM
( SELECT "t"."user_id", ( SELECT *, random()
"t"."time",
unnest("t"."collected_events") AS "event_types"
FROM FROM
( SELECT "t1"."user_id", ( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
min("t1"."time") AS "time", FROM
array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events ( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM ( FROM (
(SELECT "events"."user_id", "events"."time", 0 AS event (SELECT *
FROM events_table as "events" FROM
WHERE event_type IN (10, 11, 12, 13, 14, 15) (SELECT
) "events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION UNION
(SELECT "events"."user_id", "events"."time", 1 AS event (SELECT *
FROM events_table as "events" FROM
WHERE event_type IN (15, 16, 17, 18, 19) ) (SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION UNION
(SELECT "events"."user_id", "events"."time", 2 AS event (SELECT *
FROM events_table as "events" FROM
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) (SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION UNION
(SELECT 1, now(), 3 AS event)) t1 (SELECT *
FROM
(SELECT 1, now(), 3 AS event) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q" GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types GROUP BY types
ORDER BY types; ORDER BY types;