<a href="http://udn.yyuap.com/doc/postgresql9.3.1-cn-html-v1.1/pgstatstatements.html">postgresql 9.3.1 官方中文手冊介紹pg_stat_statements</a>
pg_stat_statements子產品提供一種跟蹤執行統計伺服器執行的所有sql語句的手段。
<b>表 f-20. pg_stat_statements 字段</b>
名字
類型
參考
描述
userid
oid
執行該語句的使用者的oid
dbid
執行該語句的資料庫的oid
query
text
calls
bigint
執行的次數
total_time
double precision
該語句花費的總時間,以毫秒計
rows
該語句恢複或影響的行的總數
shared_blks_hit
該語句命中的共享塊緩存的總數
shared_blks_read
該語句讀取的共享塊的總數
shared_blks_dirtied
該語句弄髒的共享塊的總數
shared_blks_written
該語句寫入的共享塊的總數
local_blks_hit
該語句命中的本地塊緩存的總數
local_blks_read
該語句讀取的本地塊的總數
local_blks_dirtied
該語句弄髒的本地塊的總數
local_blks_written
該語句寫入的本地塊的總數
temp_blks_read
該語句讀取的臨時塊的總數
temp_blks_written
該語句寫入的臨時塊的總數
blk_read_time
blk_write_time
這個視圖和函數pg_stat_statements_reset,隻有在通過安裝 pg_stat_statements擴充特别安裝到的資料庫中可用。 <b>不過,當pg_stat_statements子產品加載到伺服器中時, 統計跟蹤該伺服器中的所有資料庫,不管該視圖是否存在。</b>
為了安全起見,不允許非超級使用者檢視其它使用者執行的查詢的文本。不過, 如果視圖已經安裝到他們的資料庫中,那麼他們可以看到統計。
可計劃的查詢(也就是,select, insert, update, 和 delete)組合成為一個pg_stat_statements, 當它們根據一個内部哈希計算有相同的查詢結構時。典型的,如果兩個查詢語義上相等, 除了查詢中字面常量的值之外,我們認為這兩個查詢相同。工具指令(也就是,所有其他指令) 是直接基于它們的文本查詢字元串比較的。
當一個常量的值為了比對其他查詢而忽略時,該常量在pg_stat_statements 的顯示中被?替代。查詢文本的剩餘部分是第一個查詢特定散列值與 pg_stat_statements相關條目。
在一些情況下,帶有明顯不同文本的查詢可能合并到一個pg_stat_statements。 通常這隻在語義相等的查詢上發生,但是有很小的可能哈希沖突導緻不相關的查詢被合并到一個條目。 (不過,這對于屬于不同使用者或資料庫的查詢來說是不會發生的。)
因為哈希值是基于分析查詢的表示法之後來計算的,相反的也是可能的: 帶有相同文本的查詢可能表現為單獨的條目,如果它們因為一個因素的結果有不同的含義, 比如不同的search_path設定。
<b>pg_stat_statements_reset() returns void 【執行select </b><b>pg_stat_statements_reset(); 相當于清空</b><b>pg_stat_statements系統視圖</b><b>】</b>
pg_stat_statements_reset抛棄所有pg_stat_statements 到目前為止收集的統計。預設的,這個函數隻能被超級使用者執行。
pg_stat_statements.max (integer)
pg_stat_statements.max是該子產品追蹤語句的最大值 (也就是,pg_stat_statements視圖中的最大行數)。 <b>如果觀察了比這更多的不同的語句,則會抛棄執行最少的語句的資訊。 預設值是1000。這個參數隻能在伺服器啟動時設定。</b>
pg_stat_statements.track (enum)
pg_stat_statements.track控制哪個語句可以被該子產品計數。 聲明top來跟蹤頂級的語句(直接通過用戶端發出的語句)。all 也跟蹤嵌套的語句(比如包含在函數中的語句),或none禁用語句狀态收集。 預設值是top。隻有超級使用者可以更改這個設定。
pg_stat_statements.track_utility (boolean)
pg_stat_statements.track_utility控制該子產品是否追蹤工具指令。 工具指令是除了select, insert, update 和 delete的所有指令。預設值是on。隻有超級使用者可以更改這個設定。
<b>pg_stat_statements.save (boolean) </b>
pg_stat_statements.save指定在伺服器關閉時是否儲存語句狀态。 如果是off,那麼在伺服器關閉時不儲存狀态,在伺服器啟動時也不重新加載。 預設值是on。這個參數隻可以在postgresql.conf 檔案中或者伺服器指令行中設定。
<b>track_activity_query_size (integer)指定跟蹤目前執行指令的預留位元組數, 為了每個活動會話,以及pg_stat_activity.query字段。 預設值是1024。這個參數隻能在伺服器啟動時設定。</b>
這些參數必須在postgresql.conf中設定。典型的用法是:
<b>簡單安裝步驟:</b>
1、編寫$pgdata/postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 1000
pg_stat_statements.track = all
2、編譯安裝pg_stat_statements子產品
進入postgresql的源碼目錄:
cd ...postgresql-9.1.3/contrib/pg_stat_statements 【find / -name 找下...路徑】
make
make install
#如果..../share/extension目錄下存在pg_stat_statements--1.*.sql,說明安裝成功了
3、加載pg_stat_statements子產品
<b>#啟動postgresql服務</b>
pg_ctl start
<b>#加載sql檔案</b>
$ psql -f pg_stat_statements--1.2.sql
use "create extension pg_stat_statements" to load this file.
<b>#檢視版本</b>
postgres=# select * from pg_available_extensions where name = 'pg_stat_statements';
name | default_version | installed_version | comment
--------------------+-----------------+-------------------+-----------------------------------------------------------
pg_stat_statements | 1.2 | 1.2 | track execution statistics of all sql statements executed
postgres=# select * from pg_available_extension_versions where name = 'pg_stat_statements';
name | version | installed | superuser | relocatable | schema | requires | comment
--------------------+---------+-----------+-----------+-------------+--------+----------+--------------------------
pg_stat_statements | 1.2 | t | t | t | | | track execution statistics of all sql statements executed
postgres=#
<b> #進入db建立系統視圖:</b>
postgres=# create extension pg_stat_statements;
create extension
postgres=# select * from pg_stat_statements; --不報錯就可以使用了,随意ddl/dml下~再檢視pg_stat_statements會有跟蹤記錄
4、本人使用pg_stat_statements用來監控是否有drop index的情況.和慢sql...等,如下是檢視drop index 情況;
select pa.rolname,pd.datname,p.query,calls,total_time,rows
from pg_stat_statements p
join pg_authid pa on pa.oid = p.userid
join pg_database pd on pd.oid = p.dbid
-- and datname like 'bi_edw_shoes%'
and upper(query) like '%drop %index%'
-- 過濾掉存儲/函數中包含的drop index關鍵字
and upper(query) not like '%=%drop %index%' ;
【源于本人筆記】 若有書寫錯誤,表達錯誤,請指正...