I. 教程
II. SQL 语言
III. 服务器管理
- 章14. 安装指导
- 章15. 在 Windows 上安装客户端
- 章16. 操作系统环境
- 章17. 服务器配置
- 章18. 数据库角色和权限
- 章19. 管理数据库
- 章21. 区域
- 章20. 用户认证
- 章22. 日常数据库维护工作
- 章23. 备份与恢复
- 章24. 高可用性与负载均衡
- 章25. 监控数据库的活动
- 章26. 监控磁盘使用情况
- 章27. 可靠性和预写式日志
- 章28. 回归测试
IV. 客户端接口
- Chapter 28. libpq - C 库
- 章29.
- Chapter 30. ecpg - 在 C 里嵌入 SQL
- Chapter 31. 信息模式
- 31.2. 数据类型
- 31.3. informationschemacatalog_name
- 31.4. applicable_roles
- 31.5. check_constraints
- 31.6. columndomainusage
- 31.7. column_privileges
- 31.8. columnudtusage
- 31.9. columns
- 31.10. constraintcolumnusage
- 31.11. constrainttableusage
- 31.12. datatypeprivileges
- 31.13. domain_constraints
- 31.14. domainudtusage
- 31.15. domains
- 31.16. element_types
- 31.17. enabled_roles
- 31.18. keycolumnusage
- 31.20. referential_constraints
- 31.21. rolecolumngrants
- 31.22. roleroutinegrants
- 31.23. roletablegrants
- 31.24. roleusagegrants
- 31.25. routine_privileges
- 31.26. routines
- 31.27. schemata
- 31.28. sql_features
- 31.29. sqlimplementationinfo
- 31.30. sql_languages
- 31.31. sql_packages
- 31.32. sql_sizing
- 31.33. sqlsizingprofiles
- 31.34. table_constraints
- 31.35. table_privileges
- 31.36. tables
- 31.37. triggers
- 31.38. usage_privileges
- 31.39. viewcolumnusage
- 31.40. viewtableusage
- 31.41. views
V. 服务器端编程
- 章33. 扩展 SQL
- 章34. 触发器
- 章35. 规则系统
- 章36. 过程语言
- 章37. PL/pgSQL - SQL 过程语言
- 章38. PL/Tcl - Tcl 过程语言
- 章39. PL/Perl - Perl 过程语言
- 章40. PL/Python - Python 过程语言
- 章41. 服务器编程接口
VI. 参考手册
- I. SQL 命令
- ABORT
- ALTER AGGREGATE
- ALTER CONVERSION
- ALTER DATABASE
- ALTER DOMAIN
- ALTER FUNCTION
- ALTER GROUP
- ALTER INDEX
- ALTER LANGUAGE
- ALTER OPERATOR
- ALTER OPERATOR CLASS
- ALTER ROLE
- ALTER SCHEMA
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TABLESPACE
- ALTER TRIGGER
- ALTER TYPE
- ALTER USER
- ANALYZE
- BEGIN
- CHECKPOINT
- CLOSE
- CLUSTER
- COMMENT
- COMMIT PREPARED
- COMMIT
- COPY
- CREATE AGGREGATE
- CREATE CAST
- CREATE CONSTRAINT TRIGGER
- CREATE CONVERSION
- CREATE DATABASE
- CREATE DOMAIN
- CREATE FUNCTION
- CREATE GROUP
- CREATE INDEX
- CREATE LANGUAGE
- CREATE OPERATOR CLASS
- CREATE OPERATOR
- CREATE ROLE
- CREATE RULE
- CREATE SCHEMA
- CREATE SEQUENCE
- CREATE TABLE
- CREATE TABLE AS
- CREATE TABLESPACE
- CREATE TRIGGER
- CREATE TYPE
- CREATE USER
- CREATE VIEW
- DEALLOCATE
- DECLARE
- DELETE
- DROP OWNED
- DROP AGGREGATE
- DROP CAST
- DROP CONVERSION
- DROP DATABASE
- DROP DOMAIN
- DROP FUNCTION
- DROP GROUP
- DROP INDEX
- DROP LANGUAGE
- DROP OPERATOR CLASS
- DROP OPERATOR
- DROP ROLE
- DROP RULE
- DROP SCHEMA
- DROP SEQUENCE
- DROP TABLE
- DROP TABLESPACE
- DROP TRIGGER
- DROP TYPE
- DROP USER
- DROP VIEW
- END
- EXECUTE
- EXPLAIN
- FETCH
- GRANT
- INSERT
- LISTEN
- LOAD
- LOCK
- MOVE
- NOTIFY
- PREPARE TRANSACTION
- PREPARE
- REASSIGN OWNED
- REINDEX
- RELEASE SAVEPOINT
- RESET
- REVOKE
- ROLLBACK PREPARED
- ROLLBACK TO SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT
- SELECT INTO
- SET
- SET CONSTRAINTS
- SET ROLE
- SET SESSION AUTHORIZATION
- SET TRANSACTION
- SHOW
- START TRANSACTION
- TRUNCATE
- UNLISTEN
- UPDATE
- VACUUM
- II. PostgreSQL 客户端应用程序
- III. PostgreSQL 服务器应用程序
VII. 内部
- 章42. PostgreSQL 内部概貌
- 章43. 系统表
- 43.1. 概述
- 43.2. pg_aggregate
- 43.3. pg_am
- 43.4. pg_amop
- 43.5. pg_amproc
- 43.6. pg_attrdef
- 43.7. pg_attribute
- 43.8. pg_authid
- 43.9. pgauthmembers
- 43.10. pg_autovacuum
- 43.11. pg_cast
- 43.12. pg_class
- 43.13. pg_constraint
- 43.14. pg_conversion
- 43.15. pg_database
- 43.16. pg_depend
- 43.17. pg_description
- 43.18. pg_index
- 43.19. pg_inherits
- 43.20. pg_language
- 43.21. pg_largeobject
- 43.22. pg_listener
- 43.23. pg_namespace
- 43.24. pg_opclass
- 43.25. pg_operator
- 43.26. pg_pltemplate
- 43.27. pg_proc
- 43.28. pg_rewrite
- 43.29. pg_shdepend
- 43.30. pg_shdescription
- 43.31. pg_statistic
- 43.32. pg_tablespace
- 43.33. pg_trigger
- 43.34. pg_type
- 43.35. 系统视图
- 43.36. pg_cursors
- 43.37. pg_group
- 43.38. pg_indexes
- 43.39. pg_locks
- 43.40. pgpreparedstatements
- 43.41. pgpreparedxacts
- 43.42. pg_roles
- 43.43. pg_rules
- 43.44. pg_settings
- 43.45. pg_shadow
- 43.46. pg_stats
- 43.47. pg_tables
- 43.48. pgtimezoneabbrevs
- 43.49. pgtimezonenames
- 43.50. pg_user
- 43.51. pg_views
- 章44. 前/后端协议
- 章45. PostgreSQL 编码约定
- 章46. 本地语言支持
- 章47. 书写一个过程语言处理器
- 章48. 基因查询优化器
- 章49. 索引访问方法接口定义
- 章50. GiST 索引
- 章51. GIN 索引
- 章52. 数据库物理存储
- 章53. BKI 后端接口
- 章54. 规划器如何使用统计信息
VIII. 附录
25.2. 统计收集器
PostgreSQL 的统计收集器是一个支持收集和汇报服务器活跃性信息的子系统。目前,这个收集器可以给出对表和索引的访问计数,包括磁盘块的数量和独立行的项。
PostgreSQL 还可以判断当前其它服务器进程正在执行的命令是什么。这个特性独立于统计收集器子系统,可以单独地被启用或禁用。
25.2.1. 统计收集器配置
因为统计收集给查询处理增加了一些开销,所以你可以启用或禁用统计收集。这是由配置参数控制的,通常在 postgresql.conf
里设置(参阅章17获取有关设置配置参数的细节)。
要想让统计收集器运行起来,参数 stats_start_collector 必须设置为 true
。这既是缺省设置也是建议设置,但是如果你对统计信息不感兴趣并且想把所有额外的开销都去除,那么可以把它设置为 false
。不过,实际节省的开销并不多。这个选项不能在服务器运行的时候改变。
参数 stats_block_level 和 stats_row_level 控制实际发送给收集器的信息数量,因此也决定了会产生多少运行时开销。它们分别决定服务器进程是否向收集器发送磁盘块层次的访问统计和行层次的访问统计。另外,如果开启了这两个参数中的任何一个的话,针对每个数据库的事务提交和退出统计信息也将被收集。
参数 stats_command_string 控制是否监视每个服务器进程当前执行的命令字符串。统计收集器子进程的运行并不需要开启此特性。
通常这些参数在 postgresql.conf
中设置,因此它们作用于所有服务器进程,但是我们也可以在独立的会话里用 SET 命令把它们打开或者关闭。为避免普通用户把它们的活跃性隐藏不给管理员看,只有超级用户允许用 SET
命令修改这些参数。
【注意】因为参数
stats_block_level
,stats_row_level
缺省为false
,所以缺省配置只收集很少的统计信息。打开其中的一个或多个可以显著增加统计收机器生成的有用信息的数量,代价是增加一点运行时开销。
25.2.2. 查看收集到的统计信息
有一些预定义的视图可以用于显示统计收集的结果,在表25-1里列出。另外,我们可以使用底层的统计函数制作自定义的视图。
在使用统计观察当前活跃性的时候,你必须意识到这些信息并不是实时更新的。每个独立的服务器进程只是在准备进入空闲状态的时候才向收集器传送新的块和行访问计数;因此正在处理的查询或者事务并不影响显示出来的总数。同样,收集器本身也最多每 PGSTAT_STAT_INTERVAL
毫秒(缺省 500,除非在编译服务器的时候修改过)发送一次新的报告。因此显示总是落后于实际活动。但是由 stats_command_string
收集的当前查询信息总是实时更新的。
另外一个需要着重指出的是,在请求服务器进程显示任何这些统计信息的时候,它首先抓取收集器进程发出的最新报告,然后就拿这些数据作为所有统计视图和函数的快照,直到它当前的事务结束。因此统计信息在当前事务的持续期间内不会改变。类似的,每个进程的当前查询信息在该查询首次出现在事务中的时候就被收集了,并且在整个事务过程中都显示相同的信息。这是一个特性,而不是一个臭虫,因为这样就允许你在统计上执行几个查询并且对结果进行相关性检查而又不用担心这些数字会悄悄的变化。但是如果你想看每个查询的最新结果,那么就要记住在事务块外面处理这些查询。
表25-1. 标准统计视图
视图名字 | 描述 |
---|---|
pg_stat_activity | 每个服务器进程一行,显示:数据库 OID 、数据库名、进程 ID 、用户 OID 、用户名、当前查询、当前查询等待状态、当前查询开始执行的时间、进程启动的时间、客户端地址、客户端端口。报告当前查询相关信息的各个字段只有在打开 stats_command_string 参数的时候才可用。另外,除非检查这些字段的用户是超级用户或者是正在报告的进程的用户,否则它们显示为空。 |
pg_stat_database | 每个数据库一行,显示:数据库 OID 、数据库名、与该数据库连接的活跃服务器进程数、已提交的事务总数、已回滚的事务总、已读取的磁盘块总数、缓冲区命中总数(在缓冲区中找到所需要的块,从而避免读取块的动作)。 |
pg_stat_all_tables | 当前数据库中每个表一行(包括TOAST表),显示:表 OID 、模式名、表名、发起的顺序扫描总数、顺序扫描抓取的活数据行(live row)的数目、发起的索引扫描的总数(属于该表的所有索引)、索引扫描抓取的活数据行的数目、插入的行总数、更新的行总数、删除的行总数、上次手动清理该表的时间、上次由 autovacuum 自动清理该表的时间、上次手动分析该表的时间、上次由 autovacuum 自动分析该表的时间。 |
pg_stat_sys_tables | 和 pg_stat_all_tables 一样,但只显示系统表。 |
pg_stat_user_tables | 和 pg_stat_all_tables 一样,但只显示用户表。 |
pg_stat_all_indexes | 当前数据库的每个索引一行,显示:表 OID 、索引 OID 、模式名、表名、索引名、使用了该索引的索引扫描总数、索引扫描返回的索引记录数、使用该索引的简单索引扫描抓取的活表(live table)中数据行数。 |
pg_stat_sys_indexes | 和 pg_stat_all_indexes 一样,但只显示系统表上的索引。 |
pg_stat_user_indexes | 和 pg_stat_all_indexes 一样,但只显示用户表上的索引。 |
pg_statio_all_tables | 当前数据库中每个表一行(包括TOAST表),显示:表 OID 、模式名、表名、从该表中读取的磁盘块总数、缓冲区命中次数、该表上所有索引的磁盘块读取总数、该表上所有索引的缓冲区命中总数、在该表的辅助TOAST表(如果存在)上的磁盘块读取总数、在该表的辅助TOAST表(如果存在)上的缓冲区命中总数、TOAST表的索引的磁盘块读取总数、TOAST表的索引的缓冲区命中总数。 |
pg_statio_sys_tables | 和 pg_statio_all_tables 一样,但只显示系统表。 |
pg_statio_user_tables | 和 pg_statio_all_tables 一样,但只显示用户表。 |
pg_statio_all_indexes | 当前数据库中每个索引一行,显示:表 OID 、索引 OID 、模式名、表名、索引名、该索引的磁盘块读取总数、该索引的缓冲区命中总数。 |
pg_statio_sys_indexes | 和 pg_statio_all_indexes 一样,但只显示系统表。 |
pg_statio_user_indexes | 和 pg_statio_all_indexes 一样,但只显示用户表。 |
pg_statio_all_sequences | 当前数据库中每个序列对象一行,显示:序列 OID 、模式名、序列名、序列的磁盘读取总数、序列的缓冲区命中总数。 |
pg_statio_sys_sequences | 和 pg_statio_all_sequences 一样,但只系统序列。因为目前没有定义系统序列,所以这个视图总是空的。 |
pg_statio_user_sequences | 和 pg_statio_all_sequences 一样,但只显示用户序列。 |
针对每个索引的统计对于判断哪个索引得到使用以及它们的效果非常有用。
从 PostgreSQL 8.1 开始,索引既可以直接使用,也可以通过"位图扫描"使用。在位图扫描中,多个索引的输出可以通过 AND 或者 OR 规则合并;所以,在使用索引的时候,很难把独立的堆(表)行抓取和指定的索引抓取结合起来。因此,位图扫描增大它使用的 pg_stat_all_indexes
.idx_tup_read
计数。并且它还增加为表使用的 pg_stat_all_tables
.idx_tup_fetch
计数,但是它并不影响 pg_stat_all_indexes
.idx_tup_fetch
【注意】在 PostgreSQL 8.1 之前,
idx_tup_read
和idx_tup_fetch
计数实际上总是一样的。现在即使是不考虑位图扫描,它们也可能是不同的,因为idx_tup_read
记录从索引检索的记录条目,而idx_tup_fetch
记录从表中抓取的活行数;如果有已经失效的或者还未提交的行通过索引扫描找出来,后者将会小一些。
The pg_statio_
系列视图在判断缓冲区效果的时候特别有用。在实际磁盘读取远比缓冲命中小的时候,这个缓冲基本满足所有读要求,因此不需要进行内核调用。但是,这些统计并未给出所有信息。由于 PostgreSQL 处理磁盘的方式,不在 PostgreSQL 缓冲区中的数据可能仍然驻留在内核的 I/O 缓存中,因此仍然可能不必经过物理读取。对获取 PostgreSQL 的 I/O 行为的更多细节感兴趣的用户可以结合使用 PostgreSQL 的统计收集器和可以分析内核 I/O 处理的操作系统工具来获取更多细节。
其它查看统计的方法可以通过书写使用底层统计访问函数的查询来设置,这些底层统计访问函数和标准视图里使用的是一样的。这些函数在表25-2中列出。针对某个数据库进行访问的函数接受一个数据库 OID 为参数来标识需要报告哪个数据库。针对某个表或者某索引进行访问的函数接受一个表或者索引的 OID 。请注意这些函数只能看到在当前数据库里的表和索引。针对某个服务器进行访问的函数接受一个服务器进程号,其范围从 1 到当前活跃服务器的数目。
表25-2. 统计访问函数
函数 | 返回类型 | 描述 |
---|---|---|
| integer | 处理该数据库活跃的服务器进程数目 |
| bigint | 数据库中已提交事务数量 |
| bigint | 数据库中回滚的事务数量 |
| bigint | 数据库中磁盘块抓取请求的总数 |
| bigint | 为数据库在缓冲区中找到的磁盘块抓取请求的总数 |
| bigint | 如果参数是一个表,那么就是进行的顺序扫描的数目,如果参数是一个索引,那么就是索引扫描的数目。 |
| bigint | 如果参数是一个表,那么就是顺序扫描读取的行数目,如果参数是一个索引,那么就是返回的索引行的数目。 |
| bigint | 如果参数是一个表,那么就是位图扫描抓取的行数目,如果参数是一个索引,那么就是用简单索引扫描抓取的行数目。 |
| bigint | 插入表中的行数量 |
| bigint | 在表中已更新的行数量 |
| bigint | 从表中删除的行数量 |
| bigint | 表或者索引的磁盘块抓取请求的数量 |
| bigint | 在缓冲区中找到的表或者索引的磁盘块请求数目 |
| timestamptz | 用户在该表上最后一次启动清理的时间 |
| timestamptz | autovacuum 守护进程在该表上最后一次启动清理的时间 |
| timestamptz | 用户在该表上最后一次启动分析的时间 |
| timestamptz | autovacuum 守护进程在该表上最后一次启动分析的时间 |
| setof integer | 当前活跃服务器编号的集合(从 1 到活跃后端的数目)。参阅文本中的使用样例。 |
| integer | 附着在当前会话上的服务器进程 ID |
| integer | 给定的服务器进程的 PID |
| oid | 给定的服务器进程的数据库 ID |
| oid | 给定的服务器进程的用户 ID |
| text | 给定服务器进程的当前活动查询,仅在调用者是超级用户或被查询会话的用户,并且打开 stats_command_string 的时候才能获得结果。 |
| boolean | 如果给定服务器进程在等待某个锁,并且调用者是超级用户或被查询会话的用户,并且打开 stats_command_string 的时候才返回真。 |
| timestamp with time zone | 给定服务器进程当前正在执行的查询的起始时间,仅在调用者是超级用户或被查询会话的用户,并且打开 stats_command_string 的时候才能获得结果。 |
| timestamp with time zone | 给定服务器进程启动的时间,如果当前用户不是超级用户或被查询的后端的用户,则返回 NULL 。 |
| inet | 连接到给定服务器进程的客户端 IP 地址。如果是通过 Unix 域套接字连接的则返回 NULL 。如果当前用户不是超级用户或被查询会话的用户,也返回 NULL 。 |
| integer | 连接到给定服务器进程的客户端 IP 端口。如果是通过 Unix 域套接字连接的则返回 -1 。如果当前用户不是超级用户或被查询会话的用户,也返回 NULL 。 |
| boolean | 重置所有当前收集的统计。 |
【注意】
blocks_fetched
减去blocks_hit
就是为该表、索引、数据库而调用内核read()
函数的数目;不过实际的物理读取的数目通常比较低,因为还有内核级的缓冲。
pg_stat_get_backend_idset
函数提供了为每个活跃服务器进程生成一行的便捷方法。比如,要显示所有服务器进程的 PID 和它们的当前查询:
SELECT pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_activity(s.backendid) AS current_query FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论