您可以使用ROLLUP
文法實現只藉助一條查詢語句,就計算出資料在不同維度上劃分組之後得到的統計結果以及所有資料的總體值。本文將介紹如何使用ROLLUP
文法。
前提條件
PolarDB叢集版本需為PolarDB MySQL版 8.0且Revision version為8.0.1.1.0或以上,您可以參見查詢版本號碼確認叢集版本。
文法
ROLLUP
文法可以看作是GROUP BY
文法的拓展,您只需要在原本的GROUP BY
列之後加上WITH ROLLUP
即可,例如:
SELECT year, country, product, SUM(profit) AS profit
FROM sales
GROUP BY year, country, product WITH ROLLUP;
除了產生按照GROUP BY所指定的列彙總產生的結果外,ROLLUP
還會從右至左依次計算更高層次的彙總結果,直至所有資料的彙總。例如上述語句就會先按照GROUP BY year, country, product
計算總收益,再按照GROUP BY year, country
以及GROUP BY year
計算總收益,最後按照不帶任何GROUP BY
條件計算整個sales表的總收益。
使用ROLLUP
文法主要有如下優勢:
方便對資料進行多維度統計分析,簡化原本對不同維度各自進行SQL查詢的編程複雜度。
實現更快更高效的查詢處理。
ROLLUP
可以將所有的彙總工作轉移到服務端,只用讀一次資料就能夠完成原本多次查詢才能完成的統計工作,減輕了用戶端的處理負載和網路流量。
並行查詢ROLLUP增強效能測試
PolarDB還實現了針對ROLLUP
文法的並行查詢(Parallel Query)增強,支援多個線程並發計算彙總結果並輸出匯總後的結果,大大提升語句執行效率。
使用TPCH進行測試,以Q1為例,在原始的語句上加入ROLLUP
文法:
本文的TPC-H的實現基於TPC-H的基準測試,並不能與發行的TPC-H基準測試結果相比較,本文中的測試並不符合TPC-H基準測試的所有要求。
select
l_returnflag,
l_linestatus,
sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
avg(l_quantity) as avg_qty,
avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc,
count(*) as count_order
from
lineitem
where
l_shipdate <= date_sub('1998-12-01', interval ':1' day)
group by
l_returnflag,
l_linestatus
with rollup
order by
l_returnflag,
l_linestatus;
不開啟並行查詢時,耗時318.73秒。
開啟並行查詢後,耗時22.30秒,語句執行效率提升14倍以上。