本文將會為您介紹Hologres中的系統表以及每個表如何使用。
概述
Hologres系統表的組成如下表所示。
表名 | 使用場景 |
查看當前數據庫下Hologres所有表以及表屬性。 | |
查看表、視圖等關系的信息。 | |
查看表的鎖信息。 | |
PostgreSQL原生元數據表,一般是結合其他PostgreSQL系統表一起使用,查看表關系等信息。 | |
Hologres的統計信息表,用于多節點共享統計信息存儲。 | |
PostgreSQL原生統計信息表,在單節點本地直接供planner使用。 | |
查看實例內角色及其權限信息。 | |
查看用戶角色被授予對象(表、視圖等)的權限信息。 |
使用限制
表名稱以
hg
開頭的是Hologres系統表,以pg
開頭的是PostgreSQL系統表,簡稱PG系統表。PG系統表不能與業務創建的表進行關聯查詢,也不能將PG系統表的數據導入至業務創建的表中。說明Hologres 從V1.3.22版本開始,支持PG系統表與業務創建的表進行Join,以及將系統表數據導出到Hologres表,但需注意,如果存在Hologres不支持的數據類型,則無法導出到Hologres表,也無法與Hologres表進行Join。如果有需求請您升級實例。
在Hologres中,系統表中的OID字段表示表、索引、視圖等關系的唯一標志符。但Postgres是單機系統,Hologres是分布式系統,有多個FE節點,每個FE節點的OID序列通常不相同。所以當查詢結果中有OID時,可能會出現OID結果不一致的情況。
hologres.hg_table_properties
hologres.hg_table_properties用于存放當前數據庫下的所有表和表屬性,包含如下字段。
字段 | 說明 |
table_namespace | Schema名稱,Hologres會包含3個系統Schema:
|
table_name | 表名稱,Hologres包含多個系統表,如下。
|
property_key | 表屬性,包含如下屬性。
|
property_value | 表屬性的值。 |
pg_catalog.pg_tables
pg_tables保存表的元信息,包含如下字段。
字段 | 描述 |
schemaname | 表所在的Schema名稱,除了業務創建的Schema外,還包含系統Schema名稱如下。
|
tablename | 表名稱。 |
tableowner | 表的Owner。 developer用戶組:開啟了簡單權限模型(SPM)或者基于Schema級別的簡單權限模型(簡稱SLPM)。 |
tablespace | Hologres無此概念,無需關注 |
hasindexes | 如果表有(或最近有過)任何一個索引,此列為true。 |
hasrules | 如果表有(或曾經有過)規則,此列為true。 |
hastriggers | 如果表有(或曾經有過)觸發器,此列為true。 |
rowsecurity | 如果表上啟用了安全性規則,此列為true。在Hologres中無需關注。 |
pg_catalog.pg_locks
pg_locks記錄運行時的鎖信息,常用于當發現DDL卡住或者Query卡住時,定位是否有鎖,其字段如下。
字段 | 說明 |
locktype | 鎖的類型,包含如下類型。
|
database | 目標所在的數據庫的對象標識符(OID)。 |
relation | 表的對象標識符(OID),如果目標不是表,也不是表的一部分,則為null。 |
page | 在Hologres內無需關注。 |
tuple | 在Hologres內無需關注。 |
virtualxid | 事務的虛擬ID,如果目標不是虛擬事務ID,就為null。 |
transactionid | 事務的ID,如果目標不是事務ID,就為null。 |
classid | 包含該目標的系統表的對象標識符(OID),如果目標不是普通數據庫對象,則為null。在Hologres內無需關注。 |
objid | 在Hologres內無需關注。 |
objsubid | 在Hologres內無需關注。 |
virtualtransaction | 持有或者等待此鎖的事務ID。在Hologres內無需關注。 |
pid | 持有或者等待這個鎖的服務器進程的進程 ID,可以通過pg_stat_activity這個表查看進程信息。 |
mode | 這個進程的鎖模式,分為共享鎖和排他鎖等模式。 |
granted |
|
fastpath |
在Hologres內無需關注。 |
pg_catalog.pg_class
pg_class用于保存原生Postgres的所有系統信息,包含如下字段。
名字 | 說明 |
oid | 表、索引、視圖等關系的唯一標志符。 說明 Postgres是單機系統,Hologres是分布式系統,有多個FE節點,每個FE節點的OID序列通常不相同。所以當查詢結果中有OID時,可能會出現OID結果不一致的情況。 |
relname | 表、索引、視圖等關系的名稱。 |
relnamespace | 包含這個關系的Schema的OID。 |
reltype | 在Hologres內無需關注。 |
reloftype | 在Hologres內無需關注。 |
relowner | 關系的Owner。 |
relam | 在Hologres內無需關注。 |
relfilenode | 在Hologres內無需關注。 |
reltablespace | 在Hologres內無需關注。 |
relpages | 在Hologres內無需關注。 |
reltuples | 表中行的數目。只是查詢規劃器使用的一個估計值,由VACUUM、ANALYZE和幾個DDL命令更新。在Hologres中用作統計信息的行數。 |
relallvisible | 在表的可見映射中標記所有可見的頁的數目。只是查詢規劃器使用的一個估計值, 由VACUUM、ANALYZE 和幾個 DDL 命令更新。在Hologres中用作統計信息的版本 |
reltoastrelid | 在Hologres內無需關注。 |
relhasindex | 如果它是一個表而且至少有(或者最近有過)一個索引,則為true。 |
relisshared | 如果該表在整個集群中由所有數據庫共享則為true。只有某些系統表(比如pg_database)是共享的,在Hologres內無需關注。 |
relpersistence | 有如下值。
|
relkind | 有如下值。
|
relnatts | 表中列的數目(不包含系統字段)。 |
relchecks | 表里的CHECK約束的數目,詳情請參見pg_constraint,在Hologres內無需關注。 |
relhasoids | 如果為關系中每行都生成一個OID則為true。在Hologres內無需關注。 |
relhaspkey | 如果這個表有一個(或者曾經有一個)主鍵,則為true。 |
relhasrules | 如果這個表有(或曾經有)規則就為true,詳情請參見pg_rewrite。在Hologres內無需關注。 |
relhastriggers | 如果表有(或者曾經有)觸發器,則為true,詳情見pg_trigger。在Hologres內無需關注。 |
relhassubclass | 如果表有(或者曾經有)任何繼承的子表,則為true。 |
relispopulated | 在Hologres內無需關注。 |
relreplident | 在Hologres內無需關注。 |
relfrozenxid | 在Hologres內無需關注。 |
relminmxid | 在Hologres內無需關注。 |
relacl | |
reloptions | 表的屬性,例如autovacuum_enabled=false代表關閉此表的autovacuum/autoanalyze功能。 |
hologres_statistic.hg_table_statistic
Hologres的統計信息表,其字段如下。
字段 | 說明 |
unique_name | 表的唯一標志。 |
schema_version | 表的版本號。 |
statistic_version | 統計信息版本。 |
statistics | 統計信息內容,Base64編碼。 |
schema_name | 表所在Schema名稱。 |
table_name | 表名稱。 |
total_rows | 總行數。 |
sample_rows | 本統計信息的采樣行數。 |
nattr | 表的字段個數。 |
used_attrs | Analyze用到的字段。 |
histogram_attrs | 具備直方圖統計信息的字段。 |
ndv_attrs | 具備distinct value統計信息的字段。 |
user_name | Analyze或者Auto Analyze的執行者。 |
analyze_timestamp | Analyze或者Auto Analyze的執行開始時間。 |
analyze_cost | Analyze或者Auto Analyze的耗時。 |
analyze_count | Analyze或者Auto Analyze的次數。 |
pg_catalog.pg_stats
pg_stats用于保存Postgres原生的統計信息,字段如下。
字段 | 說明 |
schemaname | Schema名稱。 |
tablename | 表名稱。 |
attname | 列名(字段名)。 |
inherited | 如果為true,表示此行包括繼承子列。 |
null_frac | 記錄中字段為空的百分比。 |
avg_width | 列的平均字節寬度。 |
n_distinct |
例如,-1表示一個唯一列,即其中distinct值的個數等于行數。 |
most_common_vals | 列中Most Common Values的一個列表(如果沒有任何一個值看起來比其他值更常用,此列為空)。 |
most_common_freqs | Most Common Values值的頻率列表,即每一個常用值的出現次數除以總行數(如果most_common_vals為空,則此列為空)。 |
histogram_bounds | 將列值劃分成大小接近的組的值列表,即直方圖列表。如果存在most_common_vals,其中的值會被直方圖計算所忽略。 |
correlation | 在Hologres內無需關注。 |
most_common_elems | 在列值中,Most Common Values出現的非空元素列表。 |
most_common_elem_freqs | Most Common Values值的頻度列表,即含有至少一個給定值實例的行的分數。(如果most_common_elems為空,則此列為空)。 |
elem_count_histogram | 在Hologres中無需關注。 |
pg_catalog.pg_roles
pg_roles用于存放實例內角色及其權限信息,字段如下。
字段 | 說明 |
rolname | 角色名稱。 |
rolsuper | 角色是否具有超級用戶權限,取值如下。
|
rolinherit | 如果此角色是另一個角色的成員,角色是否能自動繼承,取值如下。
|
rolcreaterole | 能否創建更多角色,取值如下。
|
rolcreatedb | 能否創建數據庫,取值如下。
|
rolcanlogin | 角色是否能登錄實例,取值如下。
|
rolreplication | 在Hologres內無需關注。 |
rolconnlimit | 用戶的連接數限制,-1表示無限制。 |
rolpassword | 在Hologres內無需關注。 |
rolvaliduntil | 在Hologres內無需關注。 |
rolbypassrls | 在Hologres內無需關注。 |
rolconfig | 在Hologres內無需關注。 |
oid | 角色的ID,唯一標志符。 |
information_schema.role_table_grants
Hologres實例中用戶角色被授予對象(表、視圖等)的權限信息表,其字段如下。
字段 | 描述 |
grantor | 授權方角色。 |
grantee | 被授權方角色。 |
table_catalog | 數據庫名稱。 |
table_schema | Schema名稱。 |
table_name | 表名稱。 |
privilege_type | 被授予權限的類型:
|
is_grantable | 如果權限是可授予的,則此列值為 |
with_hierarchy | 權限類型為SELECT時,此列值為 |
常用SQL
一些常見命令可以通過psql簡寫來實現,詳情請參見psql。同時也可以根據業務情況選擇使用如下提供的常見SQL。
查看表對應的Hologres索引和屬性信息
SELECT * FROM hologres.hg_table_properties where table_name = '<tablename>';
tablename為表名稱。
查看表/視圖DDL
select hg_dump_script('<tablename>'); -- 表DDL
select hg_dump_script('<viewname>'); -- 視圖DDL
如果執行失敗,需要使用如下命令在DB中創建extension。
create extension hg_toolkit;
查看實例的Endpoint
除了在Hologres管理控制臺查看實例的Endpoint外,還可以通過以下命令查看實例的Endpoint。
show hg_frontend_endpoints;
查看當前實例下的所有數據庫
SELECT
d.datname AS "Name",
pg_catalog.pg_get_userbyid(d.datdba) AS "Owner",
pg_catalog.pg_encoding_to_char(d.encoding) AS "Encoding",
d.datcollate AS "Collate",
d.datctype AS "Ctype",
pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM
pg_catalog.pg_database d
WHERE
d.datname != 'postgres'
AND d.datname != 'template0'
AND d.datname != 'template1'
ORDER BY
1;
列出當前數據庫下所有User Mapping
SELECT
um.srvname AS "Server",
um.usename AS "User name"
FROM
pg_catalog.pg_user_mappings um
WHERE
um.srvname != 'query_log_store_server'
ORDER BY
1,
2;
列出當前數據庫下所有Schema
SELECT
n.nspname AS "Name",
pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM
pg_catalog.pg_namespace n
WHERE
n.nspname !~ '^pg_'
AND n.nspname <> 'information_schema'
AND n.nspname != 'hologres'
AND n.nspname != 'hologres_sample'
AND n.nspname != 'hologres_statistic'
AND n.nspname !~ '^hg_'
AND n.nspname !~ '^holo_'
ORDER BY
1;
列出當前數據庫下所有表、外表和視圖
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN
'table'
WHEN 'v' THEN
'view'
WHEN 'm' THEN
'materialized view'
WHEN 'i' THEN
'index'
WHEN 'S' THEN
'sequence'
WHEN 's' THEN
'special'
WHEN 'f' THEN
'foreign table'
WHEN 'p' THEN
'partitioned table'
WHEN 'I' THEN
'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM
pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE
c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY
1,
2;
查看當前Schema下所有表以及表Owner(不包含系統表)
--查看當前DB下所有表(包含系統表)
SELECT * FROM pg_tables
--查看當前schema下所有表以及表owner(不包含系統表)
SELECT n.nspname as "Schema"
,c.relname as "Name"
,CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type"
,pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n
ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','p','v','m','S','f','')
and n.nspname <> 'pg_catalog'
and n.nspname <> 'information_schema'
and n.nspname !~ '^pg_toast'
and pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;
查看父表對應的所有子表
-- 含分區鍵值
SELECT c.oid::pg_catalog.regclass
,c.relkind
,pg_catalog.pg_get_expr(c.relpartbound, c.oid)
FROM pg_catalog.pg_class c
,pg_catalog.pg_inherits i
WHERE c.oid = i.inhrelid
AND i.inhparent::pg_catalog.regclass = 'parent_table_name'::pg_catalog.regclass
ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT'
;
-- 不含分區鍵值
SELECT
nmsp_parent.nspname AS parent_schema,
parent.relname AS parent,
nmsp_child.nspname AS child_schema,
child.relname AS child
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname='parent_table_name';
查看所有子表的創建時間和所屬父表
select
cn.nspname as child_schema_name,c.relname as child_table_name,
pn.nspname as parent_schema_name,p.relname as parent_table_name,
to_timestamp(cp.property_value::bigint) as create_time
from pg_inherits i
left join pg_class p on p.oid=i.inhparent
left join pg_namespace pn on pn.oid = p.relnamespace
left join pg_class c on c.oid=i.inhrelid
left join pg_namespace cn on cn.oid = c.relnamespace
left join hologres.hg_table_properties cp on cp.property_key='create_time' and cp.table_namespace=pn.nspname and cp.table_name = c.relname;
查看所有外部表以及外部表對應的MaxCompute表
SELECT n.nspname
,c.relname
,s.srvname
,pg_catalog.array_to_string(
ARRAY(
SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM pg_catalog.pg_options_to_table(ftoptions)
)
,', '
)
FROM pg_catalog.pg_foreign_table f
,pg_catalog.pg_foreign_server s
,pg_catalog.pg_class c
,pg_catalog.pg_namespace n
WHERE s.oid = f.ftserver
and c.oid = f.ftrelid
and c.relnamespace = n.oid
and n.nspname not in ('hologres', 'hologres_statistic', 'pg_catalog', 'pg_toast')
;
列出當前數據庫下所有視圖
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN
'table'
WHEN 'v' THEN
'view'
WHEN 'm' THEN
'materialized view'
WHEN 'i' THEN
'index'
WHEN 'S' THEN
'sequence'
WHEN 's' THEN
'special'
WHEN 'f' THEN
'foreign table'
WHEN 'p' THEN
'partitioned table'
WHEN 'I' THEN
'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM
pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE
c.relkind IN ('v', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY
1,
2;
查看表被哪些view依賴
select * from information_schema.view_table_usage where table_name = '<table_name>';
查看表或者表字段的注釋
查看指定表中字段的注釋:
SELECT a.attname as Column, pg_catalog.format_type(a.atttypid, a.atttypmod) as "Type", a.attnotnull as "Nullable", pg_catalog.col_description(a.attrelid, a.attnum) as "Description" FROM pg_catalog.pg_attribute a WHERE a.attnum > 0 AND NOT a.attisdropped AND a.attrelid = '<schema.tablename>'::regclass::oid ORDER BY a.attnum;
其中schema.tablename為
{Schema名稱}.{表名稱}
。查看表的注釋并且包含表的Owner等相關信息。
SELECT n.nspname as "Schema", c.relname as "Name", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'table' WHEN 'I' THEN 'index' END as "Type", pg_catalog.pg_get_userbyid(c.relowner) as "Owner", pg_catalog.pg_size_pretty(pg_catalog.pg_table_size(c.oid)) as "Size", pg_catalog.obj_description(c.oid, 'pg_class') as "Description" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('r','p','v','m','S','f','') AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 1,2; --返回結果示例 List of relations Schema | Name | Type | Owner | Size | Description --------+------+-------+------------------+---------+------------- public | a | table | 1365937xxxx | xxxx bytes | abcdef (1 row)
只查看指定表的注釋信息:
select pg_catalog.obj_description('<tablename>'::regclass::oid, 'pg_class') as "Description"; --返回結果示例 Description ------------ abcdef
其中tablename為指定表名稱。
列出當前數據庫下所有用戶和角色
SELECT
r.rolname,
r.rolsuper,
r.rolinherit,
r.rolcreaterole,
r.rolcreatedb,
r.rolcanlogin,
r.rolconnlimit,
r.rolvaliduntil,
ARRAY (
SELECT
b.rolname
FROM
pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE
m.member = r.oid) AS memberof,
r.rolreplication,
r.rolbypassrls
FROM
pg_catalog.pg_roles r
WHERE
r.rolname !~ '^pg_'
ORDER BY
1;
列出當前數據庫下所有EXTENSIONS
SELECT
e.extname AS "Name",
e.extversion AS "Version",
n.nspname AS "Schema",
c.description AS "Description"
FROM
pg_catalog.pg_extension e
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace
LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid
AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass
WHERE
e.extname != 'hg_admin_cmd'
AND e.extname != 'holo_dump_stat'
AND e.extname != 'holo_funcs'
AND e.extname != 'holo_link'
AND e.extname != 'holo_system_admin'
AND e.extname != 'holo_dump_stat'
AND e.extname != 'query_log'
AND e.extname != 'plpgsql'
ORDER BY
1;
查看某個賬號的對應權限
SELECT * FROM pg_roles where rolname='<uid>'
查看當前實例下所有的用戶以及權限示例
SELECT r.rolname
,r.rolsuper
,r.rolinherit
,r.rolcreaterole
,r.rolcreatedb
,r.rolcanlogin
,r.rolconnlimit
,r.rolvaliduntil
,ARRAY(
SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid
) as memberof
,r.rolreplication
,r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
查看一個用戶有權限的所有表
SELECT current_database()::information_schema.sql_identifier AS table_catalog,
nc.nspname::information_schema.sql_identifier AS table_schema,
c.relname::information_schema.sql_identifier AS table_name,
CASE
WHEN nc.oid = pg_my_temp_schema() THEN 'LOCAL TEMPORARY'::text
WHEN c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"]) THEN 'BASE TABLE'::text
WHEN c.relkind = 'v'::"char" THEN 'VIEW'::text
WHEN c.relkind = 'f'::"char" THEN 'FOREIGN'::text
ELSE NULL::text
END::information_schema.character_data AS table_type,
CASE
WHEN (c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"])) OR (c.relkind = ANY
(ARRAY['v'::"char", 'f'::"char"])) AND (pg_relation_is_updatable(c.oid::regclass, false)
& 8) = 8 THEN 'YES'::text
ELSE 'NO'::text
END::information_schema.yes_or_no AS is_insertable_into,
CASE
WHEN t.typname IS NOT NULL THEN 'YES'::text
ELSE 'NO'::text
END::information_schema.yes_or_no AS is_typed,
NULL::character varying::information_schema.character_data AS commit_action
FROM pg_namespace nc
JOIN pg_class c ON nc.oid = c.relnamespace
LEFT JOIN (pg_type t
JOIN pg_namespace nt ON t.typnamespace = nt.oid) ON c.reloftype = t.oid
WHERE (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'f'::"char", 'p'::"char"])) AND
NOT pg_is_other_temp_schema(nc.oid) AND (pg_has_role('<USERID>', c.relowner, 'USAGE'::text)
OR has_table_privilege('<USERID>', c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text)
OR has_any_column_privilege('<USERID>', c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'::text));
查看一張表有權限的所有用戶
select rolname from pg_roles where has_table_privilege(rolname, '<schemaname>.<tablename>',
'SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER');