http://www.kuqin.com/postgreSQL8.1_doc/monitoring-stats.html 参考了这里的postsql手册页。
收集一些sql语句,用来检测db的性能:
select * from pg_stat_activity; 可以看到当前各个db的查询情况,每个进程一行。
视图 "pg_catalog.pg_stat_activity"
字段名 | 类型 | 修饰词
---------------+--------------------------+--------
datid | oid |
datname | name |
procpid | integer |
usesysid | oid |
usename | name |
current_query | text |
waiting | boolean |
query_start | timestamp with time zone |
backend_start | timestamp with time zone |
client_addr | inet |
client_port | integer |
其中,current_query是当前这个进程执行的sql语句。可以看到sql语句启动的时间query_start ,以及进程启动的时间backend_start。
select * from pg_stat_database where datname = 'you_want_db_name';
视图 "pg_catalog.pg_stat_database"
字段名 | 类型 | 修饰词
---------------+---------+--------
datid | oid |
datname | name |
numbackends | integer | <------------ 当前连接的活跃进程数目
xact_commit | bigint | <------------ 提交的事务总数
xact_rollback | bigint | <------------ 回滚总数
blks_read | bigint | <------------ 读取的磁盘块的总数
blks_hit | bigint <------------ 缓冲区命中的总数(也就是所需要的块已经在缓冲区中找到, 从而避免了读取块的动作)
select * from pg_stat_user_tables ;
select * from pg_stat_all_tables ;
select * from pg_stat_sys_tables ;
以上3条语句分别查看用户、所有、系统表的信息:
视图 "pg_catalog.pg_stat_user_tables"
字段名 | 类型 | 修饰词
------------------+--------------------------+--------
relid | oid |
schemaname | name |
relname | name |
seq_scan | bigint | 《----- 发起的顺序查找的总数
seq_tup_read | bigint | 《----- 顺序扫描抓取的有生数据行的数目
idx_scan | bigint | 《---- 发起的索引查找总数
idx_tup_fetch | bigint | 《---- 索引扫描抓取的有生数据行的数目
n_tup_ins | bigint | 《----- 插入的条数
n_tup_upd | bigint | 《--- 更新的条数
n_tup_del | bigint | 《----- 删除的条数
last_vacuum | timestamp with time zone |
last_autovacuum | timestamp with time zone |
last_analyze | timestamp with time zone |
last_autoanalyze | timestamp with time zone |
select * from pg_stat_user_indexes ; 查看索引使用情况(同样有all、sys)
视图 "pg_catalog.pg_stat_user_indexes"
字段名 | 类型 | 修饰词
---------------+--------+--------
relid | oid |
indexrelid | oid |
schemaname | name |
relname | name |
indexrelname | name |
idx_scan | bigint |
idx_tup_read | bigint |
idx_tup_fetch | bigint |
此外还有以下表,用法基本同上: pg_statio_all_tables、 pg_statio_all_indexes、 pg_statio_all_sequences。
-----------------------------------
2009-09-29 补充
SELECT oid,datname from pg_database可以查看到每个库的使用情况,比如它的oid。
而进入到pg的文件存储目录,可以看到每个库对应的目录,其名称就是上面的oid。
查看具体某个表的大小:
select pg_relation_size('table_name'); // 不过如果表比较大的话,可能计算耗时较久。
还有另外一种方法查看某个表的大小:
SELECT * from pg_class where relname='zhibo_data';
找到对应的id,然后按照上面查看数据库大小的方法,去查看对应的文件大小。
relfilenode | oid | 这个关系在磁盘上的文件的名字,如果没有则为 0 |
清理磁盘空间,因为删除掉的数据,其空间并不一定释放了。使用下面这个命令,可以清理,其FULL参数是可选的。
VACUUM FULL
------ -----------------引文: http://www.pgsqldb.org/mwiki/index.php/查看数据库表的大小
pg_relation_size('关系名') - 查看关系大小
jianingy=# select pg_relation_size('contact');
pg_relation_size
------------------
425984
(1 row)
pg_size_pretty - human readable的大小输入
jianingy=# select pg_size_pretty(pg_relation_size('contact'));
pg_size_pretty
----------------
416 kB
(1 row)
查看所有public schema里面索引大小,大到小的顺序排列
select indexrelname, pg_size_pretty(pg_relation_size(indexrelname))
from pg_stat_user_indexes where
schemaname = 'public' order by pg_relation_size(indexrelname) desc;
查看所有public schema里面表的大小,从大到小顺序排里
select relname, pg_size_pretty(pg_relation_size(relname))
from pg_stat_user_tables where
schemaname = 'public' order by pg_relation_size(relname) desc;
有些表有toast对象,比如那些有很长的文本字段的表,这个时候,除了主表之外,还有toast表,toast表的命名原则是:
pg_toast.pg_toast_{主表的文件编号}
也就是说,每个存在长字段的表,都拥有一个在 pg_toast 模式内的toast表,命名方式如上,这个时候,我们需要找到主表的文件编号,这个很容易,只要查询一下系统表 pg_class 即可:
select relfilenode from pg_class where relname='你的表名字';
然后,再用 pg_relation_size () 函数查询:
select pg_size_pretty(pg_relation_size('pg_toast.pg_toast_{主表的文件编号}');
即可。
有个工具Oid2name可以用于在命令行上查看这些信息。
----------------------------------------------------------------------------------