# 数据库对象函数
#### 数据库对象尺寸函数
数据库对象尺寸函数计算数据库对象使用的实际磁盘空间。
- pg_column_size(any) 描述：存储一个指定的数值需要的字节数（可能压缩过）。
  返回值类型：int
  备注：pg_column_size显示用于存储某个独立数据值的空间。
  ```
  gaussdb=# SELECT pg_column_size(1);
   pg_column_size 
  ----------------
                4
  (1 row)
  ```
  
- pg_database_size(oid) 描述：指定OID代表的数据库使用的磁盘空间。
  返回值类型：bigint
  
- pg_database_size(name) 描述：指定名称的数据库使用的磁盘空间。
  返回值类型：bigint
  备注：pg_database_size接受一个数据库的OID或者名称，然后返回该对象使用的全部磁盘空间。
  示例：
  ```
  gaussdb=# CREATE DATABASE testdb;
  gaussdb=# SELECT pg_database_size('testdb');
   pg_database_size 
  ------------------
           51590112
  (1 row)
  gaussdb=# DROP DATABASE testdb;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  pg_database_size(oid/name)函数的查询耗时与该oid/name所对应数据库中的对象文件数目相关，基本呈线性关系。如需进行耗时评估，可参考以下步骤：
  1. 由于耗时与软硬件环境有关，因此需要以某个库（所选择库的对象文件数目不宜过多）的测试结果为基准。根据查询耗时和库中对象文件数目，计算出单个对象文件的耗时database_size_t。
  
  2. 使用select oid,\* from pg_database where datname = 'database';查询获取需要查询库的OID，在表空间base和pg_tblspc目录下统计该OID目录下的所有文件数目database_obj_num。如果该目录中包含子目录，则需要进入查看对象文件数目，依次类推；使用ls \| wc -l查询目录下文件数目。
  
  3. 根据基准测试结果中的单文件耗时database_size_t和数据库下所有对象文件数目database_obj_num计算预估总耗时，总耗时 = database_size_t \* database_obj_num。如果预估时延过长，需考虑调整执行超时阈值，避免出现不必要的告警。
    
- get_db_source_datasize() 描述：估算当前数据库非压缩态的数据总容量。
  返回值类型：bigint
  备注：调用该函数前需要做analyze。
  示例：
  ```
  gaussdb=# analyze;
  ANALYZE
  gaussdb=# SELECT get_db_source_datasize();
   get_db_source_datasize
  ------------------------
              35384925667
  (1 row)
  ```
  
- pg_relation_size(relation regclass, fork text) 描述：指定表或索引的指定分叉树（'main'，'fsm'或'vm'）使用的磁盘空间。
  返回值类型：bigint
  
- pg_relation_size(relation regclass) 描述：pg_relation_size(..., 'main')的简写。
  返回值类型：bigint
  备注：pg_relation_size接受一个表、索引、压缩表的OID或者名称，然后返回它们的字节大小。
  
- pg_partition_size(oid, oid) 描述：指定OID代表的分区使用的磁盘空间。其中，第一个oid为表的OID，第二个oid为分区的OID。
  返回值类型：bigint
  
- pg_partition_size(text, text) 描述：指定名称的分区使用的磁盘空间。其中，第一个text为表名，第二个text为分区名。
  返回值类型：bigint
  
- pg_partition_indexes_size(oid, oid) 描述：指定OID代表的分区的索引使用的磁盘空间。其中，第一个oid为表的OID，第二个oid为分区的OID。
  返回值类型：bigint
  
- pg_partition_indexes_size(text, text) 描述：指定名称的分区的索引使用的磁盘空间。其中，第一个text为表名，第二个text为分区名。
  返回值类型：bigint
  
- pg_indexes_size(regclass) 描述：附加到指定表的索引使用的总磁盘空间。
  返回值类型：bigint
  
- pg_size_pretty(bigint) 描述：将以64位整数表示的字节值转换为具有单位的易读格式。
  返回值类型：text
  
- pg_size_pretty(numeric) 描述：将以数值表示的字节值转换为具有单位的易读格式。
  返回值类型：text
  备注：pg_size_pretty用于把其他函数的结果格式化成一种易读的格式，可以根据情况使用kB 、MB 、GB 、TB。
  
- pg_table_size(regclass) 描述：指定的表使用的磁盘空间，不计索引（但是包含TOAST，自由空间映射和可见性映射）。
  返回值类型：bigint
  
- pg_tablespace_size(oid) 描述：指定OID代表的表空间使用的磁盘空间。
  返回值类型：bigint
  
- pg_tablespace_size(name) 描述：指定名称的表空间使用的磁盘空间。
  返回值类型：bigint
  备注：
  pg_tablespace_size接受一个数据库的OID或者名称，然后返回该对象使用的全部磁盘空间。
  
- pg_total_relation_size(regclass) 描述：指定的表使用的总磁盘空间，包括所有的索引和TOAST数据。
  返回值类型：bigint
  
- dist_relation_size(nspname name, relname name) 描述：指定模式下的普通表在每个DN上的relpage数。
  返回值类型：float8
  表1参数说明 
  | 入参     | 类型  | 含义         |
  |:---|:---|:---|
  | nspname | name | 表所在的模式名。 |
  | relname  | name | 表名。     |
     
  1CN6DN数据库环境，可以看到6个DN上的relpage数：
  ```
  gaussdb=# CREATE TABLE tab(col int);
  -- node_name与当前环境的节点名称保持一致。
  gaussdb=# SELECT * FROM dist_relation_size('public','tab');
   node_name | relpages 
  -----------+----------
   datanode1 |        0
   datanode2 |        0
   datanode3 |        0
   datanode4 |        0
   datanode6 |        0
   datanode5 |        0
  (6 rows)
  gaussdb=# DROP TABLE tab;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 该函数不支持在升级观察期使用。
  
  - 该函数不支持在DN上调用。
    
- dist_partition_size(nspname name, relname name, subname name) 描述：指定模式下的分区表的指定分区在每个DN上的relpage数。
  返回值类型：float8
  表2参数说明 
  | 入参      | 类型    | 含义          |
  |:---|:---|:---|
  | nspname  | name  | 表所在的模式名。    |
  | relname  | name   | 表名。        |
  | subname | name | 需要查询的分区名。 |
     
  1CN6DN数据库环境，可以看到6个DN上的relpage数：
  ```
  gaussdb=# CREATE TABLE test_part_table(col int)
  PARTITION BY RANGE(col)
  (
      PARTITION p1 VALUES LESS THAN (10),
      PARTITION p2 VALUES LESS THAN (20),
      PARTITION p3 VALUES LESS THAN (MAXVALUE)
  );
  -- node_name与当前环境的节点名称保持一致。
  gaussdb=# SELECT * FROM dist_partition_size('public','test_part_table','p1') ORDER BY node_name;
   node_name | relpages 
  -----------+----------
   datanode1 |        0
   datanode2 |        0
   datanode3 |        0
   datanode4 |        0
   datanode5 |        0
   datanode6 |        0
  (6 rows)
  gaussdb=# DROP TABLE test_part_table;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 该函数不支持在升级观察期使用。
  
  - 该函数不支持在DN上调用。
    
- datalength(any) 描述：计算一个指定的数据需要的字节数（不考虑数据的管理空间和数据压缩，数据类型转换等情况）。
  返回值类型：int
  备注：datalength用于计算某个独立数据值的空间。
  示例：
  ```
  gaussdb=# SELECT datalength(1);
  datalength
  ------------
  4
  (1 row)
  ```
  目前支持的数据类型及计算方式见下表：
  
  | 数据类型                                                                                                                                 ||| 存储空间                      |
  |:---|---|---|:---|
  | 数值类型   | 整数类型     | TINYINT                 | 1                           |
  | 数值类型   | 整数类型     | SMALLINT                | 2                           |
  | 数值类型   | 整数类型     | INTEGER               | 4                          |
  | 数值类型   | 整数类型     | BINARY_INTEGER         | 4                          |
  | 数值类型   | 整数类型     | BIGINT                | 8                          |
  | 数值类型   | 任意精度型    | DECIMAL                | 每4位十进制数占两个字节，小数点前后数字分别计算。   |
  | 数值类型   | 任意精度型    | NUMERIC                | 每4位十进制数占两个字节，小数点前后数字分别计算。 |
  | 数值类型   | 任意精度型    | NUMBER                 | 每4位十进制数占两个字节，小数点前后数字分别计算。   |
  | 数值类型   | 序列整型  | SMALLSERIAL             | 2                            |
  | 数值类型   | 序列整型  | SERIAL                | 4                            |
  | 数值类型   | 序列整型  | BIGSERIAL               | 8                           |
  | 数值类型   | 浮点类型    | FLOAT4                 | 4                            |
  | 数值类型   | 浮点类型    | DOUBLE PRECISION       | 8                             |
  | 数值类型   | 浮点类型    | FLOAT8                 | 8                           |
  | 数值类型   | 浮点类型    | BINARY_DOUBLE          | 8                          |
  | 数值类型   | 浮点类型    | FLOAT\[(p)\]          | 每4位十进制数占两个字节，小数点前后数字分别计算。   |
  | 数值类型   | 浮点类型    | DEC\[(p\[,s\])\]      | 每4位十进制数占两个字节，小数点前后数字分别计算。    |
  | 数值类型   | 浮点类型    | INTEGER\[(p\[,s\])\]     | 每4位十进制数占两个字节，小数点前后数字分别计算。   |
  | 布尔类型    | 布尔类型   | BOOLEAN                | 1                            |
  | 字符类型    | 字符类型  | CHAR                  | 1                          |
  | 字符类型    | 字符类型  | CHAR(n)                  | n                          |
  | 字符类型    | 字符类型  | CHARACTER(n)          | n                            |
  | 字符类型    | 字符类型  | NCHAR(n)                | n                            |
  | 字符类型    | 字符类型  | VARCHAR(n)             | 字符实际字节数。                   |
  | 字符类型    | 字符类型  | CHARACTER VARYING(n)  | 字符实际字节数。                    |
  | 字符类型    | 字符类型  | VARCHAR2(n)           | 字符实际字节数。                     |
  | 字符类型    | 字符类型  | NVARCHAR2(n)           | 字符实际字节数。                   |
  | 字符类型    | 字符类型  | TEXT                 | 字符实际字节数。                     |
  | 字符类型    | 字符类型  | CLOB                   | 字符实际字节数。                   |
  | 时间类型    | 时间类型     | DATE                     | 8                           |
  | 时间类型    | 时间类型     | DATEA（仅在ORA模式下支持）     | 8                            |
  | 时间类型    | 时间类型     | TIME                   | 8                           |
  | 时间类型    | 时间类型     | TIMETZ                  | 12                         |
  | 时间类型    | 时间类型     | TIMESTAMP              | 8                          |
  | 时间类型    | 时间类型     | TIMESTAMPTZ            | 8                            |
  | 时间类型    | 时间类型     | SMALLDATETIME          | 8                          |
  | 时间类型    | 时间类型     | INTERVAL DAY TO SECOND | 16                          |
  | 时间类型    | 时间类型     | INTERVAL              | 16                         |
  | 时间类型    | 时间类型     | RELTIME                | 4                           |
  | 时间类型    | 时间类型     | ABSTIME                    | 4                          |
  | 时间类型    | 时间类型     | TINTERVAL              | 12                           |
  | ROWID类型 | ROWID类型 | ROWID                   | 24                           |
     
  
 
#### 数据库对象位置函数
- pg_relation_filenode(relation regclass) 描述：指定关系的文件节点数。
  返回值类型：oid
  备注：pg_relation_filenode接受一个表、索引、序列或压缩表的OID或者名称，并且返回当前分配给它的"filenode"数。文件节点是关系使用的文件名称的基本组件。对大多数表来说，结果和pg_class.relfilenode相同，但对确定的系统目录来说， relfilenode为0而且这个函数必须用来获取正确的值。如果传递一个没有存储的关系，比如一个视图，那么这个函数返回NULL。
  
- pg_relation_filepath(relation regclass) 描述：指定关系的文件路径名。只能用于非段页式关系。
  返回值类型：text
  备注：pg_relation_filepath类似于pg_relation_filenode，但是它返回关系的整个文件路径名（相对于数据库集群的数据目录PGDATA）。
  段页式关系建议使用段页式相关函数或视图，例如：
  ```
  SELECT e.*, f.file_name
  FROM gs_seg_extents e, gs_seg_datafiles f
  WHERE e.tablespace_name = f.tablespace_name AND e.bucketnode = f.bucketnode AND e.file_id = f.file_id AND e.forknum = f.forknum;
  ```
  
- get_large_table_name(relfile_node text, threshold_size_gb int8) 描述：根据表的文件编码（relfile_node）查询对应的表大小（单位为GB）是否超过阈值（threshold_size_gb），如果超过则返回模式名和表名（形式为schemaname.tablename）， 否则返回字符串'null'。
  返回值类型：text
  
- pg_filenode_relation(tablespace oid, filenode oid) 描述：获取对应的tablespace和relfilenode所对应的表名。
  返回类型：regclass
  
- pg_partition_filenode(partition_oid) 描述：获取到指定分区表的oid锁对应的filenode。
  返回类型：oid
  
- pg_partition_filepath(partition_oid) 描述：指定分区的文件路径名。只能用于非段页式关系。
  返回值类型：text
  备注：段页式关系建议使用段页式相关函数或视图，例如：
  ```
  SELECT e.*, f.file_name
  FROM gs_seg_extents e, gs_seg_datafiles f
  WHERE e.tablespace_name = f.tablespace_name AND e.bucketnode = f.bucketnode AND e.file_id = f.file_id AND e.forknum = f.forknum;
  ```
  
 
#### 回收站对象函数
- gs_is_recycle_object(classid, objid, objname) 描述：判断是否为回收站对象。分布式不支持该函数。
  返回值类型：Boolean
  
- gs_is_recycle_obj(classid, objid, objname) 描述：判断是否为回收站对象。其中classid为对象所在的系统表的OID，objid为对象的OID，objname为对象的名称。
  返回值类型：Boolean
  
 
