1、查看隊列情況
SELECT * FROM gp_toolkit.gp_resqueue_status;
如果出現了資源占用大於1.1 e+11SQL,則可能存在不合理執行計划的SQL, 基本跑不出來, 庫也會很卡。
2、查看用戶歸屬的隊列
select * from gp_toolkit.gp_resq_role ;
3、查看某賬號下運行中sql
SELECT * from pg_stat_activity where current_query <> '<IDLE>' and waiting ='f' and usename = 'etl_user';
所有賬號都有權限查看。
Query_start字段就是SQL真正啟動時間點
4、等待中sql
SELECT * from pg_stat_activity where current_query <> '<IDLE>' and waiting ='t';
5、檢查執行時間超長的SQL
執行如下SQL 檢查是否有select * from pg_stat_activity where current_query<>'<IDLE>' and query_start < now() - interval '10 mins';
6、終止sql
----終止sql的語句, 下語句的數字是procid,可以通過上一頁的語句查到:
select pg_cancel_backend(27334);
-----終止sql的同時終止會話。
select pg_terminate_backend(27334);
超級賬號才有終止權限, 如:super_user賬號
一定要在數據庫里終止一個SQL或任務, 因為在BDI界面終止一個外部程序任務事實上SQL沒有終止,還繼續運行。
7、執行計划:explain SQL
執行SQL前用explain SQL 查看執行計划
如果執行計划存在針對很大的表做Broadcast Motion 或Nested Loop步驟則 不合理, 則嘗試以下動作:
執行收集表的統計信息語句:ANALYZE 表名;
一般analyze 一天的分區: ANALYZE 表名_1_prt_data_part_20150305;
“_1_prt_”是數據庫分區表名固定段。 “data_part_”是我們自動腳本里生成的分區名前綴。
重新看執行計划,如果合理了,則代表源表缺少統計信息導致執行計划不合理。 只有在表的數據量發生大變化時或重來沒收集過時需要做一次收集。
8、執行計划:explain SQL
ANALYZE完源表重新看執行計划,如果還不合理,執行一下set optimizer to on; 更換一個執行計划生成器。
重新生成執行計划。如果合理了,則后續在在SQL前加上:set optimizer to on; 不要所有SQL加這個,因為該特性未發布。
如果還不合理, 則需要優化SQL, 即把SQL由多張表關聯拆開。
9、后台運行SQL, 免輸入密碼
nohup psql -h 10.154.147.130 -d 'dbname=gpadmin user=etl_user password=etl_pppp' -f /home/bdiunivers/aa.sql -L /home/bdiunivers/aa.log &
用psql 命令跑aa.sql文件,如果文件里有多個SQL, 想一個SQL報錯后不往下跑, 則在aa.sql 文件的第一行加上下面內容, 行末沒有分號 \set ON_ERROR_STOP
10、報內存不足
sql可用內存不夠大時,可以用以下方法臨時加大。 如選擇的表分區數很多可能會報內存不足,可以使用該方法。例如:
SET statement_mem='500MB';
SELECT * FROM my_big_table WHERE column='value' ORDER BY id limit 10;
RESET statement_mem;
11、left join 右表非常龐大
如果以后業務場景中確實存在left join 右表非常龐大,並且關聯字段重復值比較高,可以采取以下方式:
1,按照關聯字段進行數據打散
2,在會話級別設置以下參數
set max_statement_mem='8GB'
set statement_mem='4GB'
set gp_workfile_per_query=0
12、使用super_user創建外部表的過程:
a. 刪除並重建err表。
drop table if exists masadw .err_ext_表名;
CREATE TABLE masadw.err_ext_表名 ( cmdtime timestamp with time zone, relname text, filename text, linenum integer, bytenum integer, errmsg text, rawdata text, rawbytes bytea) DISTRIBUTED RANDOMLY;
b.把err表修改owner為etl_user
ALTER TABLE masadw.err_ext_表名 OWNER TO etl_user;
c. 創建外部表:
drop EXTERNAL TABLE if exists masadw.ext_表名;
CREATE EXTERNAL TABLE masadw.ext_表名 ( time_id integer, area_id integer, grp_code character varying(50), cust_id bigint, usr_id bigint, svc_code character varying(50)) LOCATION ( 'gphdfs://hacluster/tmp/zht/NEW_表名.TXT') FORMAT 'text' (delimiter E'' null E'' escape E'OFF')ENCODING 'UTF8'LOG ERRORS INTO masadw.err_ext_表名 SEGMENT REJECT LIMIT 10 PERCENT;
d.把外部表修改owner為etl_user:
ALTER EXTERNAL TABLE masadw.ext_表名 OWNER TO etl_user;
13、不要創建default分區
不要創建default分區, 更不要把大量數據放到default分區, 因為default分區在每個sql都會掃描。
14、找出需要做vacuum的表
select * from gp_toolkit.gp_bloat_diag ;
這些表需要做空間回收操作
一般vacumm 和analyze一起執行: vacuum analyze 表名
15、找出沒有統計信息需要做ANALYZE的表
select 'ANALYZE '||smischema||'.'||smitable||';' from gp_toolkit.gp_stats_missing where smisize = 'f' and smitable like '%_1_prt_%' and smitable not like 'err_%' and smitable not like 'ext_%' and smitable like '%201503%' order by smitable limit 10;
所有存儲過程在最后增加GPDB. analyze_partition(表名, 日期)收集一個分區表信息。
16、經常檢查數據庫狀態 gpstate -e
17、經常用nmon命令檢查seg節點資源占用率
18、經常檢查各機器/data目錄 gpssh -f allhosts
19、經常檢查各模式下表數量,總共不要超過10萬
select schemaname,count(*) from gp_tables group by schemaname order by 2 desc