-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathoptimization_demo.sql
More file actions
62 lines (52 loc) · 2.3 KB
/
optimization_demo.sql
File metadata and controls
62 lines (52 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
-- Bad example
SELECT
(SELECT CONCAT(product_name, ": ", cnt)
FROM (SELECT product_name, COUNT(*) AS cnt
FROM (SELECT o.order_id, o.order_date, p.product_id, p.product_name
FROM opt_orders o
JOIN opt_products p ON o.product_id = p.product_id
WHERE o.order_date > '2023-01-01') AS sub1
GROUP BY product_name) AS sub2
WHERE cnt = (SELECT MIN(cnt)
FROM (SELECT COUNT(*) AS cnt
FROM (SELECT o.order_id, o.order_date, p.product_id, p.product_name
FROM opt_orders o
JOIN opt_products p ON o.product_id = p.product_id
WHERE o.order_date > '2023-01-01') AS sub3
GROUP BY product_name) AS sub4)
LIMIT 1) AS min_cnt,
(SELECT CONCAT(product_name, ": ", cnt)
FROM (SELECT product_name, COUNT(*) AS cnt
FROM (SELECT o.order_id, o.order_date, p.product_id, p.product_name
FROM opt_orders o
JOIN opt_products p ON o.product_id = p.product_id
WHERE o.order_date > '2023-01-01') AS sub1
GROUP BY product_name) AS sub2
WHERE cnt = (SELECT MAX(cnt)
FROM (SELECT COUNT(*) AS cnt
FROM (SELECT o.order_id, o.order_date, p.product_id, p.product_name
FROM opt_orders o
JOIN opt_products p ON o.product_id = p.product_id
WHERE o.order_date > '2023-01-01') AS sub3
GROUP BY product_name) AS sub4)
LIMIT 1) AS max_cnt;
-- Good example
CREATE INDEX idx_opt_orders_order_date
ON opt_orders(order_date);
with cte as (
select o.order_id, o.order_date, p.product_id, p.product_name
from opt_orders as o
join opt_products as p
on o.product_id = p.product_id
where o.order_date > '2023-01-01'
)
,
cnt_products as (
select product_name, count(*) as cnt
from cte
group by product_name
)
select
(select concat(product_name, ": ", cnt) from cnt_products where cnt = (select min(cnt) as min_cnt from cnt_products) limit 1) as min_cnt,
(select concat(product_name, ": ", cnt) from cnt_products where cnt = (select max(cnt) as max_cnt from cnt_products) limit 1) as max_cnt
;