摘要:GaussDB(DWS)是MPP並行架構,若表的數據存在傾斜狀況,會引發一系列性能問題,影響用戶體驗,嚴重時可能會引發系統故障。所以能快速獲取傾斜的表並整改是GaussDB(DWS)運維管理人員比較關注的事情。數據庫
本文分享自華爲雲社區《GaussDB(DWS)發生數據傾斜不要慌,一文教你輕鬆獲取表傾斜率》,原文做者:SeqList 。微信
GaussDB(DWS)是MPP並行架構,若表的數據存在傾斜狀況,會引發一系列性能問題,影響用戶體驗,嚴重時可能會引發系統故障。所以能快速獲取傾斜的表並整改是GaussDB(DWS)運維管理人員比較關注的事情。架構
需求描述
GaussDB(DWS)自身提供pgxc_get_table_skewness視圖來查詢傾斜狀況,但實際實踐過程當中,該視圖存在性能問題,且該視圖的傾斜率計算有問題。實踐過程當中,該視圖獲取的某個表的傾斜率在不高的狀況下(例如0.03),但實際上該表是存在傾斜狀況的。併發
同時在不少時候咱們須要獲取一個schema下全部表的傾斜率,以排查傾斜問題,pgxc_get_table_skewness在產品文檔中也描述是一個性能較差的視圖。運維
所以項目實踐過程當中急需一個性能好且能表達傾斜狀況的函數或視圖。函數
設計思路
GaussDB(DWS)有獲取每一個DN的空間大小函數table_distribution,經過該函數,咱們能快速獲取每一個DN的大小,同時能夠根據每一個DN的大小,來獲取表的傾斜狀況:性能
skewness = (max(dnsize) - avg(dnsize))*100/max(dnsize)學習
該傾斜率公式計算表的最大DN空間大小與平均DN空間大小的佔比,能準確反映傾斜率,乘100爲表現百分比。測試
實現過程
根據傾斜公式,咱們得出如下SQL,該SQL能快速獲取schema全部表的傾斜狀況,下面以public爲例:url
select schemaname,tablename,sum(dnsize)/1024^3 dnsize_gb,(max(dnsize) - avg(dnsize))*100/nullif(max(dnsize),0) skewness_factor from ( select schemaname ,tablename ,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[4]::bigint as vprocname ,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[5]::bigint as dnsize from ( select nspname as schemaname ,relname as tablename ,table_distribution(nspname,relname)::text as tbl_dis from pg_class a inner join pg_namespace b on a.relnamespace = b.oid and a.relkind = 'r' and b.oid not in (100) ) ) where schemaname= 'public' group by 1,2 order by 3 desc;
結果樣例以下,經過例子,能夠看出來,test13這個表2GB,且發生嚴重的傾斜97%,同時store_sales1一個70GB的大表也存在傾斜狀況58%
與GaussDB(DWS)的pgxc_get_table_skewness視圖結果比對
使用GaussDB(DWS) 的系統視圖pgxc_get_table_skewness,比較難看出來store_sales1存在傾斜狀況。
此處咱們使用的是系統視圖pgxc_get_table_skewness獲取
select * from PGXC_GET_TABLE_SKEWNESS where schemaname = 'public' and tablename in ('store_sales1','test13');
從結果上看,skewratio字段,test13表能看出來存在嚴重傾斜狀況,而store_sales1的skewratio值只有0.031,看不出來存在傾斜狀況。但事實上該表是存在必定傾斜的
咱們經過table_skewness看每一個DN的數據分佈驗證,發現store_sales1的確存在必定傾斜。
總結:
GaussDB(DWS)的傾斜率獲取視圖pgxc_get_table_skewness的結果,雖能反映嚴重傾斜的表,但存在傾斜的大表則比較難看出來。同時該函數存在必定的性能問題,較多表的狀況下基本執行不出來。
本文提供的傾斜率獲取辦法能比較準確反映表的傾斜狀況且能叫快速獲取整schema全部的表的傾斜率方法;該方法在測試過程當中,數據量越大,表越多,執行的時間會越慢,測試一個schema約3800張表,共40TB左右的數據,在5分鐘左右獲取全部表的空間大小與傾斜率。
但本文提供的方法只能對單個schema操做,對整個數據庫獲取表空間大小與傾斜率,實測沒法執行成功。若對時效性不要求的話,能夠天天固定一個時間,已跑批的形式,獲取一個庫的全部表清單,使用table_distribution函數,一次一個表地獲取表的空間信息,使用多併發執行,這樣的方式能在必定時間內將全部表的空間狀況執行完成。
例如:對整庫有10萬張表的狀況,可使用100個併發同時執行 insert into table_size_info select * from table_distribution('schema.table'); 這樣的方式將10萬張表的DN空間信息獲取完成,而後使用本文的公式彙總獲取每一個表的傾斜率與空間總大小。
想了解GuassDB(DWS)更多信息,歡迎微信搜索「GaussDB DWS」關注微信公衆號,和您分享最新最全的PB級數倉黑科技,後臺還可獲取衆多學習資料~