目前提供(gong)的傾斜查詢接口有函數:table_distribution(schemaname text, tablename text) 、table_distribution() 以及視圖PGXC_GET_TABLE_SKEWNESS,客(ke)戶可以根(gen)據自身業務情況來選(xuan)擇使用。
場景一:磁盤滿后快速定位存儲傾斜的表
首先(xian),通過(guo)pg_stat_get_last_data_changed_time(oid)函數(shu)(shu)查詢出(chu)近(jin)期發(fa)生過(guo)數(shu)(shu)據變更(geng)的(de)(de)表,介于表的(de)(de)最(zui)后(hou)修改(gai)(gai)時間只在進行IUD操(cao)作(zuo)的(de)(de)CN記(ji)錄,要查詢庫(ku)內1天(tian)(間隔可(ke)在函數(shu)(shu)中調(diao)整)內被修改(gai)(gai)的(de)(de)所有表,可(ke)以使用如下封裝函數(shu)(shu):
CREATE OR REPLACE FUNCTION get_last_changed_table(OUT schemaname text, OUT relname text)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C''';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT b.nspname,a.relname FROM pg_class a INNER JOIN pg_namespace b on a.relnamespace = b.oid where pg_stat_get_last_data_changed_time(a.oid) BETWEEN current_timestamp - 1 AND current_timestamp;''';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname = row_data.nspname;
relname = row_data.relname;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE plpgsql;
然后,通(tong)過table_distribution(schemaname text, tablename text)查詢(xun)出表在各個DN占用的存儲(chu)空(kong)間。
SELECT table_distribution(schemaname,relname) FROM get_last_changed_table();
場景二:常規數據傾斜巡檢
- 在庫中表個數少于1W的場景,直接使用傾斜視圖查詢當前庫內所有表的數據傾斜情況。
SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC;
- 在庫中表個數非常多(至少大于1W)的場景,因PGXC_GET_TABLE_SKEWNESS涉及全庫查并計算非常全面的傾斜字段,所以可能會花費比較長的時間(小時級),建議參考PGXC_GET_TABLE_SKEWNESS視圖定義,直接使用table_distribution()函數自定義輸出,減少輸出列進行計算優化,例如:
SELECT schemaname,tablename,max(dnsize) AS maxsize, min(dnsize) AS minsize
FROM pg_catalog.pg_class c
INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname
INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = 'H'
GROUP BY schemaname,tablename;
場景三:查詢某個表的數據傾斜情況
執行(xing)以下SQL查詢某個表的數(shu)據傾斜(xie)情況,其中table_name替換為(wei)實際的表名(ming)。
SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
返(fan)回如下類似(si)信息。若(ruo)各(ge)DN上數據(ju)分(fen)布(bu)差小于10%,表(biao)明數據(ju)分(fen)布(bu)均衡。若(ruo)大于10%,則表(biao)示數據(ju)出現傾斜。
gaussdb=>SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
count | node_name
------+-----------
11010 | datanode4
10000 | datanode3
12001 | datanode2
8995 | datanode1
10000 | datanode5
7999 | datanode6
9995 | datanode7
10000 | datanode8
(8 rows)