更新时间:2026-07-28 GMT+08:00
分享

技术原理

核心机制

DATABASE LINK查询远程表基本流程的时序图如图1所示。

图1 DATABASE LINK查询远程表基本流程的时序图
  • 语法解析阶段

    用户通过使用DATABASE LINK查询远程对象时,解析器会识别@dblink语法标识符,并生成对应的DBLink关系节点,标记远程对象属性。

  • 语义分析阶段

    若目标表为远程对象(table@dblink):

    • 数据库将调用DBLink插件接口,向远程数据库发起访问元数据信息请求,并在此过程中主动开启一个远程事务。
    • 获取到远程元数据并缓存至本地数据库系统表中。
    • 后续访问流程:

  • 查询优化阶段

    优化器通过DBLink插件的接口生成向远程库发送的SQL语句,以获取查询代价和执行计划。

  • 执行器阶段

    执行算子调用DBLink插件接口,向远程数据库发送SQL请求,获取远程结果集并序列化为本地数据格式,结果逐层向上传递。

  • 事务提交阶段

    提交本地事务时自动同步远程事务状态。

接口介绍

DATABASE LINK主要使用的系统视图如表1所示,具体描述请参见《参考》中“系统表和系统视图 > 系统视图 > DATABASE LINK”章节。

表1 系统视图

视图名

视图说明

GS_DB_LINKS

显示DATABASE LINK对象的相关信息,用户可以查看属于自己和PUBLIC级别的DATABASE LINK信息。

V$DBLINK

该视图数据取自于GS_DB_LINKS,但只记录在本次session中曾被使用过或正在使用的DATABASE LINK信息。默认只有管理员用户可以查看该视图。

DATABASE LINK主要使用的系统函数如表2所示,具体描述请参见《参考》中“SQL参考 > 函数和操作符 > DATABASE LINK函数”章节。

表2 系统函数

函数名

函数说明

close_database_link(dblink_name name)

通过DBLink名称主动关闭当前session下该DBLink的连接。

gs_ora_diag(dblink_name name DEFAULT NULL::name)

该函数只能获取连接Oracle库的DBLink对应的信息。通过DBLink名称获取gs_ora_fdw版本、GaussDB版本、Oracle数据库客户端版本以及Oracle数据库服务端版本信息。当参数为NULL时,如果查询用户是管理员用户还会返回ORACLE_HOME、ORACLE_SID、TNS_ADMIN、TWO_TASK、LDAP_ADMIN等信息,非管理员用户不显示。

gs_ora_get_handle_alloc(dblink_oid oid)

通过DBLink的OID,获取该DBLink通过OCI使用的内存大小,单位为字节。

gs_ora_get_handle_alloc_all()

获取每个节点的环境句柄,所有DBLink通过OCI使用的内存大小计算总和,单位为字节。

gs_ora_connection_status(dblink_oid oid)

通过DBLink的OID,获取该DBLink在当前session下的连接状态。

is_dblink_in_use(dblink_oid oid)

通过DBLink的OID,获取该DBLink是否被使用。

dblink_has_updatasent (dblink_oid oid)

判断当前事务中是否使用OID对应的DATABASE LINK进行发送了DML语句且未提交。

is_dblink_in_transaction(dblink_oid oid)

通过DBLink的OID,获取该DBLink是否正在事务中。

DATABASE LINK主要使用的系统表如表3所示,具体描述请参见《参考》中“系统表和系统视图 > 系统表 > DATABASE LINK”章节。

表3 系统表

表名

描述

GS_DATABASE_LINK

该表用于存储DATABASE LINK信息的系统表,主要记录的是DATABASE LINK对象的详细信息。只有具备SYSADMIN权限的用户才可以对该系统表进行读操作。

相关文档