PostgreSQLChina 潜水
  • 1发帖数
  • 1主题数
  • 0关注数
  • 0粉丝
开启左侧

PostgreSQL如何获取系统视图/函数对应的源码

[复制链接]
PostgreSQLChina 发表于 2021-9-18 10:36:29 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
作者:吴聪


我们在使用PostgreSQL的时候大概经常会碰到如许的情况,对于某个体系视图的某个字段不知道是干啥的,看了官方文档后也一脸懵逼,不知道是啥意思。


这个时候如果我们可以看到该视图或者该字段对应的源码,那么想要理解起来就会方便多了。


以pg_stat_database这个视图为例,它的两个字段tup_returned和tup_fetched的官方文档表明如下:



  • tup_returned:这个数据库中查询返回的行数;
  • tup_fetched:这个数据库中查询获取的行数。


看完估计你也和我一样懵逼,返回、获取有啥差别?看这个字面表明压根就不明确啥意思啊,那我们该怎么查看其相关源码呢?


对于这种情况,建议按照下面方式一步步来获取:


1、查看视图对应的SQL语句



pg13@cnndr4pptliot-> psql bill bill -Epsql (13beta3)Type 'help' for help.bill@bill=>\d+ pg_stat_database                                    View 'pg_catalog.pg_stat_database'        Column         |           Type           | Collation | Nullable | Default | Storage | Description-----------------------+--------------------------+-----------+----------+---------+---------+------------- datid                 | oid                      |           |          |         | plain   | datname               | name                     |           |          |         | plain   | numbackends           | integer                  |           |          |         | plain   | xact_commit           | bigint                   |           |          |         | plain   | xact_rollback         | bigint                   |           |          |         | plain   | blks_read             | bigint                   |           |          |         | plain   | blks_hit              | bigint                   |           |          |         | plain   | tup_returned          | bigint                   |           |          |         | plain   | tup_fetched           | bigint                   |           |          |         | plain   | tup_inserted          | bigint                   |           |          |         | plain   | tup_updated           | bigint                   |           |          |         | plain   | tup_deleted           | bigint                   |           |          |         | plain   | conflicts             | bigint                   |           |          |         | plain   | temp_files            | bigint                   |           |          |         | plain   | temp_bytes            | bigint                   |           |          |         | plain   | deadlocks             | bigint                   |           |          |         | plain   | checksum_failures     | bigint                   |           |          |         | plain   | checksum_last_failure | timestamp with time zone |           |          |         | plain   | blk_read_time         | double precision         |           |          |         | plain   | blk_write_time        | double precision         |           |          |         | plain   | stats_reset           | timestamp with time zone |           |          |         | plain   |View definition: SELECT d.oid AS datid,    d.datname,        CASE            WHEN d.oid = 0::oid THEN 0            ELSE pg_stat_get_db_numbackends(d.oid)        END AS numbackends,    pg_stat_get_db_xact_commit(d.oid) AS xact_commit,    pg_stat_get_db_xact_rollback(d.oid) AS xact_rollback,    pg_stat_get_db_blocks_fetched(d.oid) - pg_stat_get_db_blocks_hit(d.oid) AS blks_read,    pg_stat_get_db_blocks_hit(d.oid) AS blks_hit,    pg_stat_get_db_tuples_returned(d.oid) AS tup_returned,    pg_stat_get_db_tuples_fetched(d.oid) AS tup_fetched,    pg_stat_get_db_tuples_inserted(d.oid) AS tup_inserted,    pg_stat_get_db_tuples_updated(d.oid) AS tup_updated,    pg_stat_get_db_tuples_deleted(d.oid) AS tup_deleted,    pg_stat_get_db_conflict_all(d.oid) AS conflicts,    pg_stat_get_db_temp_files(d.oid) AS temp_files,    pg_stat_get_db_temp_bytes(d.oid) AS temp_bytes,    pg_stat_get_db_deadlocks(d.oid) AS deadlocks,    pg_stat_get_db_checksum_failures(d.oid) AS checksum_failures,    pg_stat_get_db_checksum_last_failure(d.oid) AS checksum_last_failure,    pg_stat_get_db_blk_read_time(d.oid) AS blk_read_time,    pg_stat_get_db_blk_write_time(d.oid) AS blk_write_time,    pg_stat_get_db_stat_reset_time(d.oid) AS stats_reset   FROM ( SELECT 0 AS oid,            NULL::name AS datname        UNION ALL         SELECT pg_database.oid,            pg_database.datname           FROM pg_database) d;

如许我们就知道了tup_returned和tup_fetched分别对应的是pg_stat_get_db_tuples_returned和pg_stat_get_db_tuples_fetched这两个函数。


2、查看体系函数对应的源码函数



bill@bill=>\df+ pg_stat_get_db_tuples_returnedList of functions-[ RECORD 1 ]-------+-----------------------------------------Schema              | pg_catalogName                | pg_stat_get_db_tuples_returnedResult data type    | bigintArgument data types | oidType                | funcVolatility          | stableParallel            | restrictedOwner               | postgresSecurity            | invokerAccess privileges   |Language            | internalSource code         | pg_stat_get_db_tuples_returnedDescription         | statistics: tuples returned for database

以pg_stat_get_db_tuples_returned为例,其对应的源码函数是pg_stat_get_db_tuples_returned。


3、分析相关源码



既然知道了对应的源码函数那就简单了,直接去搜索就完事了。


Datumpg_stat_get_tuples_returned(PG_FUNCTION_ARGS){    Oid            relid = PG_GETARG_OID(0);    int64        result;    PgStat_StatTabEntry *tabentry;    if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)        result = 0;    else        result = (int64) (tabentry->tuples_returned);    PG_RETURN_INT64(result);}

接着逐步分析相关的源码,查看相关注释就可以了,我们可以得出结论:



  • tuples_returned,:直接扫描表的tuple行数 + 直接扫描索引的索引条目数。
  • tuples_fetched:通过索引指向的tid去回表访问的tuple行数。


参考链接:
http://www.postgres.cn/docs/13/monitoring-stats.html#MONITORING-PG-STAT-DATABASE-VIEW
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

猜你喜欢
在线客服邮箱
wxcy#wkgb.net

邮箱地址#换为@

Powered by 创意电子 ©2018-现在 专注资源实战分享源码下载站联盟商城