
# 技术原理
#### 核心机制
DATABASE LINK查询远程表基本流程的时序图如[图1]所示。
图1DATABASE LINK查询远程表基本流程的时序图   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620640379.png "点击放大")
- 语法解析阶段 用户通过使用DATABASE LINK查询远程对象时，解析器会识别@dblink语法标识符，并生成对应的DBLink关系节点，标记远程对象属性。
  
- 语义分析阶段 若目标表为远程对象（table@dblink）：
  - 数据库将调用DBLink插件接口，向远程数据库发起访问元数据信息请求，并在此过程中主动开启一个远程事务。
  
  - 获取到远程元数据并缓存至本地数据库系统表中。
  
  - 后续访问流程： ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620640381.png "点击放大")
    
   
- 查询优化阶段 优化器通过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权限的用户才可以对该系统表进行读操作。 |
   
