PostgreSQL模組——pg_stat_statements詳解和安裝測試
其實很簡單,最近可能需要對postgresql進行監控,所以接觸了很多相關的監控命令和工具,這邊文章主要是記錄下工作過程,怕之後會忘記。
我想要的功能:記錄每條sql的執行時間,能夠查詢每天執行最慢的top10。
下面先介紹下pg_stat_statements:(翻譯)
pg_stat_statements模組提供了一種跟蹤執行的所有SQL語句的統計資訊的方法。
這個模組必須改寫設定檔postgresql.conf中的shared_preload_libraries變數(之後講解如何配置),這是因為他需要額外的共用記憶體。同時也意味著需要重啟服務。
1-先看下pg_stat_statements視圖
欄位名 |
類型 |
引用 |
說明 |
userid |
oid |
pg_authid.oid |
執行者id |
dbid |
oid |
pg_database.oid |
執行資料庫id |
query |
text |
|
執行的語句 |
calls |
bigint |
|
執行次數 |
total_time |
double precision |
|
執行總時間 (平均值=total_time/calls ) |
rows |
bigint |
|
影響的總行數 |
shared_blks_hit |
bigint |
|
共用塊命中數量 |
shared_blks_read |
bigint |
|
共用塊讀數量 |
shared_blks_written |
bigint |
|
共用塊寫數量 |
local_blks_hit |
bigint |
|
本地塊命中數量 |
local_blks_read |
bigint |
|
本地塊讀數量 |
local_blks_written |
bigint |
|
本地塊寫數量 |
如上視圖和函數pg_stat_statements_reset只有在資料庫已經正確安裝,並且已經執行pg_stat_statements.sql指令碼後才會生效。只要pg_stat_statements成功添加,就會Tracing Service器上所有的資料庫操作。
處於安全的原因,普通使用者不允許查看其他使用者執行的語句資訊(query),如果視圖安裝到他的資料庫,那麼就可以查看相關的統計資訊(子健做的實驗實在超級使用者下:postgres使用者postgres庫)
注意,如果語句資訊(query)一樣,不論任何out-of-line變數的值被使用,都會認為這幾條聲明是相同的。使用out-of-line變數有助於組織語句並且可能回事統計資料更加有用
2-函數
pg_stat_statements_reset() returns void
pg_stat_statements_reset丟棄目前由pg_stat_statements統計的所有資訊,預設情況下,這個函數只能運行在超級使用者下。
3-組態變數
pg_stat_statements.max(integer)
pg_stat_statements.max是最大追蹤的統計資料數量(即,視圖中的最大行數)。如果資料量大於最大值,那麼執行最少的語句將會被丟棄(本人測試,如果語句執行次數都為1時,其次是時間久的資料被丟棄),這個值預設是1000,這個變數在服務啟動前設定。
pg_stat_statements.track(enum)
pg_stat_statements.track控制統計資料規則,top用於追蹤top-level statement(直接由用戶端方發送的),all還會追蹤嵌套的statements(例如在函數中調用的statements)
pg_stat_statements.track_utility(boolen)
pg_stat_statements.track_utility控制是否跟蹤公用程式命令(utility commands),公用程式命令是SELECT/INSERT/UPDATE/DELETE以外的命令,預設值是開啟,只有超級使用者可以更改此設定。
pg_stat_statements.save(boolean)
pg_stat_statements.save指定在伺服器關閉時,是否儲存統計資訊。如果設定off,服務關閉時,統計資訊將不會儲存。預設值是on。這個值只能夠在postgresql.conf中或者命令列設定。