今天主要介紹一下PG一個很重要的模塊--pg_stat_statements模塊,對於做性能觀察還是很不錯的。
1、簡介
pg_stat_statements模塊提供一種方法追蹤一個服務器所執行的所有 SQL 語句的執行統計信息,可以用於統計數據庫的資源開銷,分析TOP SQL。
該模塊必須通過在postgresql.conf的shared_preload_libraries中增加pg_stat_statements來載入,因為它需要額外的共享內存。
這意味着增加或移除該模塊需要一次服務器重啓。
當pg_stat_statements被載入時,它會跟蹤該服務器 的所有數據庫的統計信息。
該模塊提供了一個視圖 pg_stat_statements以及函數pg_stat_statements_reset 和pg_stat_statements用於訪問和操縱這些統計信息。
這些視圖和函數不是全局可用的,但是可以用CREATE EXTENSION pg_stat_statements 為特定數據庫啓用它們。
2、字段含義
pg_stat_statements字段列含義如下
3、常用函數
pg_stat_statements_reset() returns void
pg_stat_statements_reset丟棄目前由pg_stat_statements統計的所有信息,默認情況下,這個函數只能運行在超級用户下。
4、常用變量
1)pg_stat_statements.max(integer)
pg_stat_statements.max是最大追蹤的統計數據數量(即,視圖中的最大行數)。如果數據量大於最大值,那麼執行最少的語句將會被丟棄(本人測試,如果語句執行次數都為1時,其次是時間久的數據被丟棄),這個值默認是1000,這個變量在服務啓動前設置。
2)pg_stat_statements.track(enum)
pg_stat_statements.track控制統計數據規則,top用於追蹤top-level statement(直接由客户端方發送的),all還會追蹤嵌套的statements(例如在函數中調用的statements)
3)pg_stat_statements.track_utility(boolen)
pg_stat_statements.track_utility控制是否跟蹤公共程序命令(utility commands),公共程序命令是
SELECT/INSERT/UPDATE/DELETE以外的命令,默認值是開啓,只有超級用户可以更改此設置。
4)pg_stat_statements.save(boolean)
pg_stat_statements.save指定在服務器關閉時,是否保存統計信息。如果設置off,服務關閉時,統計信息將不會保存。默認值是on。這個值只能夠在postgresql.conf中或者命令行設置。
該模塊需要額外的共享內存,內存大小大致為pg_stat_statements.max* track_activity_query_size。要注意的是,一旦模塊被加載,即使pg_stat_statements.track設置為none,共享內存都會被消耗。
1、編譯安裝pg_stat_statements模塊
pg_stat_statements是PostgreSQL的核心插件之一,可以在編譯PostgreSQL時安裝,也可以單獨安裝。如果$pgpath/share/extension目錄下存在
pg_stat_statements--1.0.sql,説明安裝成功了
find / -name 'pg_stat_statements'
cd /opt/software/postgresql-12.2/contrib/pg_stat_statements
make && make install
2、修改配置文件postgresql.conf
$ vim /data/pgdata/data/postgresql.conf
====================================================================================
#------------------------------------------------------------------------------
# PG_STAT_STATEMENTS OPTIONS
#------------------------------------------------------------------------------
shared_preload_libraries = 'pg_stat_statements' #加載pg_stat_statements模塊
track_io_timing = on #跟蹤IO消耗的時間
pg_stat_statements.max = 10000 #最多保留多少條統計信息,通過LRU算法,覆蓋老的記錄。
pg_stat_statements.track = all #all:所有SQL包括函數內嵌套的SQL,top:直接執行的SQL(函數內的sql不被跟蹤),none:不跟蹤
pg_stat_statements.track_utility=on # 是否跟蹤非DML語句 (例如DDL,DCL),on表示跟蹤, off表示不跟蹤
pg_stat_statements.save = on # 重啓後是否保留統計信息
#track_activity_query_size = 2048 #設置單條SQL的最長長度,超過被截斷顯示
3、重啓PG服務
cd /opt/postgres/bin
./pg_ctl restart -m fast
./pg_ctl status
4、加載pg_stat_statements模塊
到這裏就完成pg_stat_statements模塊安裝了。
./psql
create extension pg_stat_statements;
\dx