背景

我们在做综合应用项目的时候,通常会面临客户的每个应用系统使用各自的数据库,或者存放在不同的服务器。查询报表可能使用多个应用数据,这样就需要跨库读取数据表或视图。

KINGBASE_FDW 是一种外部访问接口,它可以被用来访问存储在外部的数据。想要使用fdw访问数据需要先确保:网络通,数据库访问配置(sys_hba.conf)正常,同时远端数据库的用户必须有表的相关权限。

简述KINGBASE_FDW

  1. 创建扩展 kingbase_fdw

    create extension kingbase_fdw;
  2. 创建远程Server

    create server srv_test foreign data wrapper kingbase_fdw options(host '127.0.0.1',port '54321',dbname 'test');
  3. 创建User maping

    create user mapping for kingbase server srv_test options (user 'kingbase', password '123456');
  4. 创建外部表

    create foreign table public.test_tab01 (
    id integer ,
    c1 text
    ) server srv_test options (schema_name 'public', table_name 'tab01');
  5. 测试外部表

    • 读取全部数据
    explain analyze  select * from public.test_tab01;
    
    Foreign Scan on test_tab01  (cost=100.00..150.95 rows=1365 width=36) (actual time=0.230..509.699 rows=1000000 loops=1)
    Planning Time: 0.041 ms
    Execution Time: 532.775 ms
    • 支持索引
    explain analyze select * from public.test_tab01 where id = 1000 ;
    
    Foreign Scan on test_tab01  (cost=100.00..150.95 rows=1365 width=36) (actual time=0.230..0.440 rows=1 loops=1)
    Planning Time: 0.041 ms
    Execution Time: 0.485 ms

本地与外部表的关联查询

  1. 本地表与外部表的关联查询

    首先将外部表的数据缓存到本地,然后与本地表进行hash join。

    explain analyze select * from test02 a join public.tab01_db b on a.id = b.id  where a.id <= 1000;
    
    Hash Join  (cost=153.85..40186.87 rows=1081 width=37) (actual time=0.421..568.423 rows=1000 loops=1)
    Hash Cond: (b.id = a.id)
    -> Foreign Scan on tab01_db b (cost=100.00..37508.00 rows=1000000 width=25) (actual time=0.211..512.571 rows=1000000 loops=1)
    -> Hash (cost=40.34..40.34 rows=1081 width=12) (actual time=0.202..0.203 rows=1000 loops=1)
    Buckets: 2048 Batches: 1 Memory Usage: 59kB
    -> Index Scan using test02_pkey on test02 a (cost=0.42..40.34 rows=1081 width=12) (actual time=0.011..0.120 rows=1000 loops=1)
    Index Cond: (id <= 1000)
    Planning Time: 0.168 ms
    Execution Time: 568.608 ms
  2. 使用lateral改写查询

    Nested Loop 虽然没有读取外部表的全部数据,但多次通过session读取外部表,使得执行时间较长。如果loops数值更大,则执行时间远超整体读取数据方式。

    explain analyze select * from test02 a
    join lateral ( select * from public.tab01_db b where a.id = b.id limit all) b on true
    where a.id <= 1000; Nested Loop (cost=100.42..21628731.58 rows=1081 width=37) (actual time=0.224..102.295 rows=1000 loops=1)
    -> Index Scan using test02_pkey on test02 a (cost=0.42..40.34 rows=1081 width=12) (actual time=0.012..0.354 rows=1000 loops=1)
    Index Cond: (id <= 1000)
    -> Foreign Scan on tab01_db b (cost=100.00..20008.02 rows=1 width=25) (actual time=0.084..0.084 rows=1 loops=1000)
    Planning Time: 0.138 ms
    Execution Time: 102.522 ms
  3. 利用数组改写查询

    利用数组,可以一次性读取所需外部表的少量数据,即避免读取多余数据量,又防止多次建立session而产生的执行时长。由于是通过session读取外部表数据,cpu_tuple_cost默认值0.01会影响执行计划的正确性,建议设置cpu_tuple_cost值0.2 以上。

    explain analyze
    with a as (select * from test02 where id <= 1000),
    ids as ( select array(select id from a) ids),
    b as ( select b.* from tab01_db b, ids where id = any (ids))
    select /*+set(cpu_tuple_cost 0.2)*/ *
    from a, b
    where a.id = b.id; Hash Join (cost=813.27..220724.94 rows=1 width=37) (actual time=1.045..2.281 rows=1000 loops=1)
    Hash Cond: (b.id = a.id)
    CTE a
    -> Index Scan using test02_pkey on test02 (cost=0.42..40.34 rows=1081 width=12) (actual time=0.011..0.122 rows=1000 loops=1)
    Index Cond: (id <= 1000)
    InitPlan 2 (returns $1)
    -> CTE Scan on a a_1 (cost=0.00..21.62 rows=1081 width=4) (actual time=0.013..0.246 rows=1000 loops=1)
    -> Foreign Scan on tab01_db b (cost=100.00..220010.10 rows=10 width=25) (actual time=0.953..2.048 rows=1000 loops=1)
    -> Hash (cost=432.40..432.40 rows=1081 width=12) (actual time=0.086..0.086 rows=1000 loops=1)
    Buckets: 2048 Batches: 1 Memory Usage: 59kB
    -> CTE Scan on a (cost=0.00..432.40 rows=1081 width=12) (actual time=0.000..0.037 rows=1000 loops=1)
    Planning Time: 0.192 ms
    Execution Time: 2.471 ms

    总结

    外部表在查询中,属于“黑盒”,所以必须通过lateral、CTE或子查询,使得外部表可以接受过滤条件。

    综合考虑查询脚本的复杂程度,建议需要外部表数据时,极少量则使用lateral,少于30%使用数组方式,多于30%使用整体方式。

KingabseES kingbase_fdw 跨库关联查询的更多相关文章

  1. T-SQL——关于跨库连接查询

    目录 0. 同一台服务器不同数据库 1. 使用跨库查询函数--OpenDataSource() 2. 使用链接服务器(Linking Server) 3. 使用OpenDataSource()函数和链 ...

  2. oracle跨库连接查询

    一.授权(本地客户器端授权当前用户) grant create database link to szfile 第一种连接方法:配置本地数据库服务器的tnsnames.ora文件 SZFILE = ( ...

  3. 2020-07-07:mysql如何实现跨库join查询?

    福哥答案2020-07-07: 1.同服务跨库.表名称带上库名.SELECT * FROM 数据库名称1.表名称 JOIN 数据库名称2.表名称 ON 数据库名称1.表名称.tid = 数据库名称2. ...

  4. Mysql的跨服务器 关联查询--Federated引擎

    1.确认开启Federated引擎     查询FEDERATED功能是否开启: show ENGINES;       2.如果状态为NO则需修改my.ini文件,增加一行federated配置: ...

  5. springboot整合mybatis进行跨库查询

    业务场景: 当一个公司大了之后就会将各种业务进行分开,最简单的就是例如:公司的机构表,那么就会将他们分成开来,那么就会在一个实例中, 如果要获取相关信息就会去关联这张表进行关联查询 从而导致了跨库关联 ...

  6. 如何玩转跨库Join?跨数据库实例查询应用实践

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  7. mysql 跨库查询问题

    MySQL实现跨服务器查询 https://blog.csdn.net/LYK_for_dba/article/details/78180444 mysql> create database l ...

  8. mysql跨库联表查询

    首先要了解database与instance区别,见<MySQL中的实例.数据库关系简介> 跨库分为同一个instance下的跨库和不同instance下的跨库. 一.同一个MySQL实例 ...

  9. 如何使用SQL SERVER数据库跨库查询

    SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...

  10. SQL Server跨库查询

    方式一: 语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELEC ...

随机推荐

  1. [BUUCTF][WEB][极客大挑战 2019]Http 1

    打开靶机提供的url 右键查看网页源代码 发现一个链接 (Secret.php),访问看看 返回: It doesn't come from 'https://Sycsecret.buuoj.cn' ...

  2. 以二进制文件安装K8S之部署Master高可用集群

    如下以二进制文件方式部署安全的Kubernetes Master高可用集群,具体步骤如下: 1.下载Kubernetes服务的二进制文件 2.部署kube-apiserver服务 3.创建客户端CA证 ...

  3. 构建SatelliteRpc:基于Kestrel的RPC框架(整体设计篇)

    背景 之前在.NET 性能优化群内交流时,我们发现很多朋友对于高性能网络框架有需求,需要创建自己的消息服务器.游戏服务器或者物联网网关.但是大多数小伙伴只知道 DotNetty,虽然 DotNetty ...

  4. Qt开发技术:QCharts(二)QCharts折线图介绍、Demo以及代码详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. 项目实战:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111241205长期持续带来更多项目与技术分享, ...

  6. 【Filament】绘制圆形

    1 前言 ​ Filament环境搭建中介绍了 Filament 的 Windows 和 Android 环境搭,绘制三角形中介绍了绘制纯色和彩色三角形,绘制矩形中介绍了绘制纯色和彩色矩形,本文将使用 ...

  7. 第137篇:重学ES6模块化

    好家伙,   我原本以为学完模块化之后,就能非常顺利的完成我的项目分包, 然而并没有,这是非常重要的知识,而我没有学好 所以我决定重学一遍   本篇为<阮一峰 ECMAScript 6 (ES6 ...

  8. DataGear 制作支持表单交互和多图表联动的数据可视化看板

    对于数据可视化,有时需要根据用户输入的查询条件展示限定范围的数据图表,DataGear的看板表单功能可以快速方便地实现此类需求. 下面的看板示例,包含一个柱状图.一个饼图和一个地图,用户可以通过看板表 ...

  9. 【Azure 应用程序见解】通过无代码方式在App Service中启用Application Insights后,如何修改在Application Insights中显示的App Service实例名呢?

    问题描述 在App Service中,可以非常容易的启动Application Insights服务.默认情况中,在Application Insights中查看信息时候,其中的对象名称默认为App ...

  10. nmcli命令详解(创建热点,连接wifi,管理连接等)

    目录 简述 语法 比较有用的选项(OPTION) 对象 general对象(常规信息) 用途 语法 networking对象(整个网络) 用途 语法 命令示例 radio对象(无线开关) 用途 语法 ...