?
本文檔使用
php中文網(wǎng)手冊 發(fā)布
PostgreSQL的統(tǒng)計收集器是一個支持收集和匯報服務器活躍性信息的子系統(tǒng)。 目前,這個收集器可以給出對表和索引的訪問計數(shù),包括磁盤塊的數(shù)量和獨立行的項。 它還跟蹤每個表中的行的總數(shù),每個表的過去的真空和分析時間。它也可以計算用戶定義的函數(shù)的調(diào)用,和在每個人的總花費的時間。
PostgreSQL還可以判斷當前其它服務器進程正在執(zhí)行的命令是什么。 這是一個收集過程中的獨立設施。
因為統(tǒng)計收集給查詢處理增加了一些開銷,所以你可以啟用或禁用統(tǒng)計收集。這是由配置參數(shù)控制的, 通常在postgresql.conf里設置(參閱Chapter 18獲取有關設置配置參數(shù)的細節(jié))。
這個參數(shù)track_counts控制關于表和索引是否被統(tǒng)計。
參數(shù)track_functions實現(xiàn)了對用戶子弟年故意函數(shù)用法的追蹤。
參數(shù)track_activities控制是否監(jiān)視每個服務器進程當前執(zhí)行的命令字符串。
通常這些參數(shù)在postgresql.conf中設置,因此它們作用于所有服務器進程, 但是我們也可以在獨立的會話里用SET命令把它們打開或者關閉。 為避免普通用戶把它們的活躍性隱藏不給管理員看, 只有超級用戶允許用SET命令修改這些參數(shù)。
統(tǒng)計收集器與后端通信通過臨時文件獲得需要的信息(包括autovacuum)。 這些文件存放在pg_stat_tmp子目錄中。 當postmaster關閉時,一個統(tǒng)計數(shù)據(jù)的永久副本存放在global 子目錄中。為了提高性能,stats_temp_directory參數(shù) 可以指向一個依據(jù)RAM的文件系統(tǒng),降低物理I/O需求。
有一些預定義的視圖可以用于顯示統(tǒng)計收集的結果,在表Table 27-1里列出。另外,我們可以使用底層的統(tǒng)計函數(shù)制作自定義的視圖。
在使用統(tǒng)計觀察當前活躍性的時候,你必須意識到這些信息并不是實時更新的。 每個獨立的服務器進程只是在準備進入空閑狀態(tài)的時候才向收集器傳送新的塊和行訪問計數(shù); 因此正在處理的查詢或者事務并不影響顯示出來的總數(shù)。同樣,收集器本身也最 多每PGSTAT_STAT_INTERVAL毫秒(缺省500,除非在編譯服務器的時候修改過)發(fā)送一 次新的報告。因此顯示總是落后于實際活動。但是由track_activities收集的當前查 詢信息總是實時更新的。
另外一個需要著重指出的是,在請求服務器進程顯示任何這些統(tǒng)計信息的時候,
它首先抓取收集器進程發(fā)出的最新報告,然后就拿這些數(shù)據(jù)作為所有統(tǒng)計視圖
和函數(shù)的快照,直到它當前的事務結束。因此統(tǒng)計信息在當前事務的持續(xù)期間內(nèi)不會改
變。類似的,每個進程的當前查詢信息在該查詢首次出現(xiàn)在事務中的時候就被收集了,
并且在整個事務過程中都顯示相同的信息。這是一個特性,而不是一個臭蟲,因為這樣
就允許你在統(tǒng)計上執(zhí)行幾個查詢并且對結果進行相關性檢查而又不用擔心這些數(shù)字會悄悄
的變化。但是如果你想看每個查詢的最新結果,那么就要記住在事務塊外面處理這些查詢。
另外,你可以調(diào)用pg_stat_clear_snapshot
,這將丟棄
目前交易的統(tǒng)計數(shù)據(jù)快照(如有)。下次使用
統(tǒng)計信息將導致獲取一個新的快照
Table 27-1. 標準統(tǒng)計視圖
視圖名字 | 描述 |
---|---|
pg_stat_activity | 每個服務器進程一行,顯示:數(shù)據(jù)庫OID、數(shù)據(jù)庫名、進程ID、用戶OID、用戶名、客戶的地址和端口號,服務器進程, 當前交易、當前查詢等待狀態(tài)、當前查詢開始執(zhí)行的時間、進程啟動的時間、進程的等待狀態(tài)和文字當前查詢。。報告當前查詢相關信息的各個字段只有在打開track_activities參數(shù) 的時候才可用。另外,這些列是唯一可見的,如果檢查視圖的用戶是一個超級用戶或、擁有相同進程的用戶。 |
只有一行,通過后臺寫進程來顯示集群范圍內(nèi)的統(tǒng)計數(shù)據(jù): 預計檢查點的數(shù)量,要求的檢查點,檢查點寫入的緩沖區(qū)和清理掃描, 以及后臺寫進程停滯一個清理掃描的時間(因為需要寫很多緩沖區(qū))。 同時還包括共享緩沖池的統(tǒng)計數(shù)據(jù),包括后臺進程寫入的緩沖區(qū)( 也就是說,不是通過后臺寫進程)以及分配的總緩沖區(qū)。 | ? |
pg_stat_database | 每個數(shù)據(jù)庫一行, 顯示:數(shù)據(jù)庫OID、數(shù)據(jù)庫名、與該數(shù)據(jù)庫連接的活躍服務器進程數(shù)、 已提交的事務總數(shù)、已回滾的事務總、已讀取的磁盤塊總數(shù)、緩沖區(qū)命中總數(shù) (在緩沖區(qū)中找到所需要的塊,從而避免讀取塊的動作)。返回插入,抓取,更新,刪除的列數(shù)。 |
pg_stat_all_tables | 當前數(shù)據(jù)庫中每個表一行(包括TOAST表),顯示:表OID、模式名、表名、發(fā)起的 順序掃描總數(shù)、順序掃描抓取的活數(shù)據(jù)行(liverow)的數(shù)目、發(fā)起的索引掃描的總數(shù) (屬于該表的所有索引)、索引掃描抓取的活數(shù)據(jù)行的數(shù)目、插入的行總數(shù)、更新的行總數(shù) 、刪除的行總數(shù)、數(shù)行更新,它們是熱(即,沒有單獨的索引更新), 活的和死行數(shù),上次手動清理該表的時間、上次由autovacuum自動清理該表的時間、 上次手動分析該表的時間、上次由autovacuum自動分析該表的時間。 |
pg_stat_sys_tables | 和pg_stat_all_tables一樣,但只顯示系統(tǒng)表。 |
pg_stat_user_tables | 和pg_stat_all_tables一樣,但只顯示用戶表。 |
pg_stat_all_indexes | 當前數(shù)據(jù)庫的每個索引一行,顯示:表OID、索引OID、模式名、表名、索引名、 使用了該索引的索引掃描總數(shù)、索引掃描返回的索引記錄數(shù)、使用該索引的簡 單索引掃描抓取的活表(livetable)中數(shù)據(jù)行數(shù)。 |
pg_stat_sys_indexes | 和pg_stat_all_indexes一樣,但只顯示系統(tǒng)表上的索引。 |
pg_stat_user_indexes | 和pg_stat_all_indexes一樣,但只顯示用戶表上的索引。 |
pg_statio_all_tables | 當前數(shù)據(jù)庫中每個表一行(包括TOAST表),顯示:表OID、模式名、表名、 從該表中讀取的磁盤塊總數(shù)、緩沖區(qū)命中次數(shù)、該表上所有索引的磁盤塊讀取總數(shù)、 該表上所有索引的緩沖區(qū)命中總數(shù)、在該表的輔助TOAST表(如果存在)上的磁盤塊讀取總數(shù)、 在該表的輔助TOAST表(如果存在)上的緩沖區(qū)命中總數(shù)、TOAST表的索引的磁盤塊讀 取總數(shù)、TOAST表的索引的緩沖區(qū)命中總數(shù)。 |
pg_statio_sys_tables | 和pg_statio_all_tables一樣,但只顯示系統(tǒng)表。 |
pg_statio_user_tables | 和pg_statio_all_tables一樣,但只顯示用戶表。 |
pg_statio_all_indexes | 當前數(shù)據(jù)庫中每個索引一行,顯示:表OID、索引OID、模式名、 表名、索引名、該索引的磁盤塊讀取總數(shù)、該索引的緩沖區(qū)命中總數(shù)。 |
pg_statio_sys_indexes | 和pg_statio_all_indexes一樣,但只顯示系統(tǒng)表。 |
pg_statio_user_indexes | 和pg_statio_all_indexes一樣,但只顯示用戶表。 |
pg_statio_all_sequences | 當前數(shù)據(jù)庫中每個序列對象一行,顯示:序列OID、模式名、序列名、序列的磁盤讀取總數(shù)、序列的緩沖區(qū)命中總數(shù)。 |
pg_statio_sys_sequences | 和pg_statio_all_sequences一樣,但只系統(tǒng)序列。因為目前沒有定義系統(tǒng)序列,所以這個視圖總是空的。 |
pg_statio_user_sequences | 和pg_statio_all_sequences一樣,但只顯示用戶序列。 |
pg_stat_user_functions | 對于所有跟蹤功能,函數(shù)的OID,模式,名稱,數(shù)量 通話總時間,和自我的時間。自我時間是 在函數(shù)本身所花費的時間量,總時間包括 它調(diào)用函數(shù)所花費的時間。時間值以毫秒為單位。 |
針對每個索引的統(tǒng)計對于判斷哪個索引得到使用以及它們的效果非常有用
從PostgreSQL8.1開始,索引既可以直接使用,也可以通過"位圖掃描"使用。 在位圖掃描中,多個索引的輸出可以通過AND或者OR規(guī)則合并;所以,在使用索引的時候, 很難把獨立的堆(表)行抓取和指定的索引抓取結合起來。因此,位圖掃描增大它使用 的pg_stat_all_indexes計數(shù)。并且它還增加為表使用的 idx_tup_fetch計數(shù),但是它并不影 響pg_stat_all_indexes. idx_tup_fetch
Note: 在PostgreSQL8.1之前, idx_tup_read和 idx_tup_fetch計數(shù)實際上 總是一樣的?,F(xiàn)在即使是不考慮位圖掃描,它們也可能是不同的,因為 idx_tup_read記錄從索引檢索的記錄條目,而 idx_tup_fetch記錄從表中抓取的活行數(shù); 如果有已經(jīng)失效的或者還未提交的行通過索引掃描找出來,后者將會小一些。
Thepg_statio_系列視圖在判斷緩沖區(qū)效果的時候特別有用。在實際磁盤讀取‘ 遠比緩沖命中小的時候,這個緩沖基本滿足所有讀要求,因此不需要進行內(nèi)核調(diào) 用。但是,這些統(tǒng)計并未給出所有信息。由于PostgreSQL處理磁盤的方式,不 在PostgreSQL緩沖區(qū)中的數(shù)據(jù)可能仍然駐留在內(nèi)核的I/O緩存中,因此仍然可 能不必經(jīng)過物理讀取。對獲取PostgreSQL的I/O行為的更多細節(jié)感興趣的用戶 可以結合使用PostgreSQL的統(tǒng)計收集器和可以分析內(nèi)核I/O處理的操作系統(tǒng)工 具來獲取更多細節(jié)。
其它查看統(tǒng)計的方法可以通過書寫使用底層統(tǒng)計訪問函數(shù)的查詢來設置, 這些底層統(tǒng)計訪問函數(shù)和標準視圖里使用的是一樣的。這些函數(shù)在Table 27-2 中列出。針對某個數(shù)據(jù)庫進行訪問的函數(shù)接受一個數(shù)據(jù)庫OID為參數(shù)來標 識需要報告哪個數(shù)據(jù)庫。每個表和每個索引的功能 表或索引的OID。函數(shù)調(diào)用統(tǒng)計函數(shù)采取一個函數(shù)的OID。請注意這些函數(shù)只能看到在當前數(shù)據(jù)庫里的表和索引。針 對某個服務器進行訪問的函數(shù)接受一個服務器進程號, 其范圍從1到當前活躍服務器的數(shù)目。
Table 27-2. 統(tǒng)計訪問函數(shù)
函數(shù) | 返回類型 | 描述 |
---|---|---|
pg_stat_get_db_numbackends (o id) |
integer | 處理該數(shù)據(jù)庫活躍的服務器進程數(shù)目 |
pg_stat_get_db_xact_commit (o id) |
bigint | 數(shù)據(jù)庫中已提交事務數(shù)量目 |
pg_stat_get_db_xact_rollback (o id) |
bigint | 數(shù)據(jù)庫中回滾的事務數(shù)量 |
pg_stat_get_db_blocks_fetched (o id) |
bigint | 數(shù)據(jù)庫中磁盤塊抓取請求的總數(shù) |
pg_stat_get_db_blocks_hit (o id) |
bigint | 為數(shù)據(jù)庫在緩沖區(qū)中找到的磁盤塊抓取請求的總數(shù) |
pg_stat_get_db_tuples_returned (o id) |
bigint | 為數(shù)據(jù)庫返回的Tuple數(shù) |
pg_stat_get_db_tuples_fetched (o id) |
bigint | 為數(shù)據(jù)庫中獲取的Tuple數(shù) |
pg_stat_get_db_tuples_inserted (o id) |
bigint | 在數(shù)據(jù)庫中插入Tuple數(shù) |
pg_stat_get_db_tuples_updated (o id) |
bigint | 在數(shù)據(jù)庫中更新的Tuple數(shù) |
pg_stat_get_db_tuples_deleted (o id) |
bigint | 數(shù)據(jù)庫中刪除Tuple數(shù) |
pg_stat_get_numscans (o id) |
bigint | 如果參數(shù)是一個表,那么就是順序掃描讀取的行數(shù)目, 如果參數(shù)是一個索引,那么就是返回的索引行的數(shù)目。 |
pg_stat_get_tuples_returned (o id) |
bigint | 如果參數(shù)是一個表,那么就是順序掃描讀取的行數(shù)目,如果參數(shù)是一個索引,那么就是返回的索引行的數(shù)目。 |
pg_stat_get_tuples_fetched (o id) |
bigint | 如果參數(shù)是一個表,那么就是位圖掃描抓取的行數(shù)目,如果參數(shù)是一個索引,那么就是用簡單索引掃描抓取的行數(shù)目。 |
pg_stat_get_tuples_inserted (o id) |
bigint | 插入表中的行數(shù)量 |
pg_stat_get_tuples_updated (o id) |
bigint | 在表中已更新的行數(shù)量,包括熱更新 |
pg_stat_get_tuples_deleted (o id) |
bigint | 從表中刪除的行數(shù)量 |
pg_stat_get_tuples_hot_updated (o id) |
bigint | 熱更新的行數(shù)表 |
pg_stat_get_live_tuples (o id) |
bigint | 活行數(shù)表 |
pg_stat_get_dead_tuples (o id) |
bigint | 死行數(shù)表 |
pg_stat_get_blocks_fetched (o id) |
bigint | 表或者索引的磁盤塊抓取請求的數(shù)量 |
pg_stat_get_blocks_hit (o id) |
bigint | 在緩沖區(qū)中找到的表或者索引的磁盤塊請求數(shù)目 |
pg_stat_get_last_vacuum_time (o id) |
timestamptz | 用戶在該表上最后一次啟動清理的時間 |
pg_stat_get_last_autovacuum_time (o id) |
timestamptz | autovacuum守護進程在該表上最后一次啟動清理的時間 |
pg_stat_get_last_analyze_time (o id) |
timestamptz | 用戶在該表上最后一次啟動分析的時間 |
pg_stat_get_last_autoanalyze_time (o id) |
timestamptz | autovacuum守護進程在該表上最后一次啟動分析的時間 |
pg_backend_p id() |
integer | 當前會話的服務器進程的進程ID |
pg_stat_get_activity (integer) |
setofrecord | 返回一個關于帶有特殊PID號的后臺進程的記錄信息,或者是每個 活動的后臺進程的記錄(如果聲明了NULL)。 返回結果是pg_stat_activity視圖中的一個子集。 |
pg_stat_get_function_calls (o id) |
bigint | 函數(shù)已被調(diào)用次數(shù) |
pg_stat_get_function_time (o id) |
bigint | 總掛鐘時間花費在功能,在微秒的。包括 在這個函數(shù)調(diào)用所花費的時間。 |
pg_stat_get_function_self_time (o id) |
bigint | 只有在此功能所花費的時間。在所謂的功能所花費的時間 被排除在外。 |
pg_stat_get_backend_ idset() |
setofinteger | 設置當前活動的服務器進程數(shù)(從1到 活動服務器進程的數(shù)量)??丛谖谋局惺褂玫睦印?/td> |
pg_stat_get_backend_p id (integer) |
integer | 給定的服務器進程的PID |
pg_stat_get_backend_db id (integer) |
o id | 給定的服務器進程的數(shù)據(jù)庫ID |
pg_stat_get_backend_user id (integer) |
o id | 給定的服務器進程的用戶ID |
pg_stat_get_backend_activity (integer) |
text | 給定服務器進程的當前活動查詢,僅在調(diào)用者是超級用戶或被查詢會話的用戶, 并且打開track_activities的時候才能獲得結果。 |
pg_stat_get_backend_waiting (integer) |
boolean | 如果給定服務器進程在等待某個鎖,并且調(diào)用者是超級用戶或被查詢會話的用戶, 并且打開track_activities的時候才返回真。 |
pg_stat_get_backend_activity_start (integer) |
timestampwithtimezone | 給定服務器進程當前正在執(zhí)行的查詢的起始時間,僅在調(diào)用者是超級用戶或被查詢會話的用戶, 并且打開track_activities的時候才能獲得結果。 |
pg_stat_get_backend_xact_start (integer) |
timestampwithtimezone | 給定的服務進程當前正在執(zhí)行的事務的開始時間,但只有 當權用戶是超級用戶或正在被插敘的會話的相同用戶(同時 ,開啟track_activities)才可以使用。 |
pg_stat_get_backend_start (integer) |
timestampwithtimezone | timezone給定服務器進程啟動的時間,如果當前用戶不是超級用戶或被查詢的后端的用戶,則返回NULL。 |
pg_stat_get_backend_client_addr (integer) |
inet | 連接到給定服務器進程的客戶端IP地址。如果是通過Unix域套接字連接的則返回NULL。 如果當前用戶不是超級用戶或被查詢會話的用戶,也返回NULL。 |
pg_stat_get_backend_client_port (integer) |
integer | 連接到給定服務器進程的客戶端IP端口。如果是通過Unix域套接字連接的則返回-1。 如果當前用戶不是超級用戶或被查詢會話的用戶,也返回NULL。 |
pg_stat_get_bgwriter_timed_checkpoints() |
bigint | 后臺寫進程開啟定時檢查點的時間(因為 checkpoint_timeout時間已經(jīng)過期了) |
pg_stat_get_bgwriter_requested_checkpoints() |
bigint | 后臺寫進程開啟基于后端請求的檢查點的時間,因為已經(jīng)超過了checkpoint_segments 或因為已經(jīng)執(zhí)行了CHECKPOINT。 |
pg_stat_get_bgwriter_buf_written_checkpoints() |
bigint | 在檢查點期間后臺寫進程寫入的緩沖區(qū)數(shù)目。 |
pg_stat_get_bgwriter_buf_written_clean() |
bigint | 為日常清理臟塊,后臺寫進程寫入的緩沖區(qū)數(shù)目。 |
pg_stat_get_bgwriter_maxwritten_clean() |
bigint | 后臺寫進程停止清理掃描的時間,因為 已經(jīng)寫入了更多的緩沖區(qū)(相比bgwriter_lru_maxpages 參數(shù)聲明的緩沖區(qū)數(shù))。 |
pg_stat_get_buf_written_backend() |
bigint | 后端進程寫入的緩沖區(qū)數(shù),因為它們需要分配一個新的緩沖區(qū)。 |
pg_stat_get_buf_alloc() |
bigint | 分配的總緩沖區(qū)數(shù)。 |
pg_stat_clear_snapshot() |
void | 忽略當前的統(tǒng)計快照。 |
pg_stat_reset() |
void | 為當前數(shù)據(jù)庫重置統(tǒng)計計數(shù)器為0(需要超級用戶權限)。 |
pg_stat_reset_shared (text) |
void | 為當前數(shù)據(jù)庫集群重置共享統(tǒng)計計數(shù)器為0(需要超級用戶權限)。 調(diào)用pg_stat_reset_shared('bgwriter')將所有 pg_stat_bgwriter顯示的值置為0。 |
pg_stat_reset_single_table_counters (o id) |
void | 為當前數(shù)據(jù)庫中的一個表或索引重置統(tǒng)計為0(需要超級用戶權限)。 |
pg_stat_reset_single_function_counters (o id) |
void | 為當前數(shù)據(jù)庫中的一個函數(shù)重置統(tǒng)計為0(需要超級用戶權限)。 |
Note:
pg_stat_get_blocks_fetched
減去pg_stat_get_blocks_hit
就是為該表、索引、數(shù)據(jù)庫而調(diào)用 內(nèi)核read()
函數(shù)的數(shù)目;不過實際的物理讀取的數(shù)目通常比較低, 因為還有內(nèi)核級的緩沖。*_blks_read用減法統(tǒng)計列獲取減去結果
后端ID的所有功能,訪問有關后端的信息索引數(shù),除了pg_stat_get_activity
,這是由PID功能。
pg_stat_get_backend_ idset
函數(shù)提供了為每個活躍服務器進程生成一行的便捷方法。
比如,要顯示所有服務器進程的PID和它們的當前查詢:
SELECTpg_stat_get_backend_p id(s.backend id)ASprocp id, pg_stat_get_backend_activity(s.backend id)AScurrent_query FROM(SELECTpg_stat_get_backend_ idset()ASbackend id)ASs;