全部產品
Search
文件中心

PolarDB:ROLLUP的並行加速

更新時間:Jul 06, 2024

您可以使用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秒。1

  • 開啟並行查詢後,耗時22.30秒,語句執行效率提升14倍以上。2