Переглянути джерело

rewrite TPC-H q20 using CTEs

Gopal V 10 роки тому
батько
коміт
f277ab7162
1 змінених файлів з 33 додано та 50 видалено
  1. 33 50
      sample-queries-tpch/tpch_query20.sql

+ 33 - 50
sample-queries-tpch/tpch_query20.sql

@@ -1,57 +1,40 @@
-drop view q20_tmp1_cached;
-drop view q20_tmp2_cached;
-drop view q20_tmp3_cached;
-drop view q20_tmp4_cached;
-
-create view q20_tmp1_cached as
-select distinct p_partkey
-from
-	part
-where
-	p_name like 'forest%';
-
-create view q20_tmp2_cached as
-select
-	l_partkey,
-	l_suppkey,
-	0.5 * sum(l_quantity) as sum_quantity
-from
-	lineitem
-where
-	l_shipdate >= '1994-01-01'
-	and l_shipdate < '1995-01-01'
-group by l_partkey, l_suppkey;
-
-create view q20_tmp3_cached as
-select
-	ps_suppkey,
-	ps_availqty,
-	sum_quantity
-from
-	partsupp, q20_tmp1_cached, q20_tmp2_cached
-where
-	ps_partkey = p_partkey
-	and ps_partkey = l_partkey
-	and ps_suppkey = l_suppkey;
-
-create view q20_tmp4_cached as
+-- explain formatted 
+with tmp1 as (
+    select p_partkey from part where p_name like 'forest%'
+),
+tmp2 as (
+    select s_name, s_address, s_suppkey
+    from supplier, nation
+    where s_nationkey = n_nationkey
+    and n_name = 'CANADA'
+),
+tmp3 as (
+    select l_partkey, 0.5 * sum(l_quantity) as sum_quantity, l_suppkey
+    from lineitem, tmp2
+    where l_shipdate >= '1994-01-01' and l_shipdate <= '1995-01-01'
+    and l_suppkey = s_suppkey 
+    group by l_partkey, l_suppkey
+),
+tmp4 as (
+    select ps_partkey, ps_suppkey, ps_availqty
+    from partsupp 
+    where ps_partkey IN (select p_partkey from tmp1)
+),
+tmp5 as (
 select
-	ps_suppkey
+    ps_suppkey
 from
-	q20_tmp3_cached
+    tmp4, tmp3
 where
-	ps_availqty > sum_quantity
-group by ps_suppkey;
-
+    ps_partkey = l_partkey
+    and ps_suppkey = l_suppkey
+    and ps_availqty > sum_quantity
+)
 select
-	s_name,
-	s_address
+    s_name,
+    s_address
 from
-	supplier,
-	nation,
-	q20_tmp4_cached
+    supplier
 where
-	s_nationkey = n_nationkey
-	and n_name = 'CANADA'
-	and s_suppkey = ps_suppkey
+    s_suppkey IN (select ps_suppkey from tmp5)
 order by s_name;