KingabseES kingbase_fdw 跨库关联查询
背景
我们在做综合应用项目的时候,通常会面临客户的每个应用系统使用各自的数据库,或者存放在不同的服务器。查询报表可能使用多个应用数据,这样就需要跨库读取数据表或视图。
KINGBASE_FDW 是一种外部访问接口,它可以被用来访问存储在外部的数据。想要使用fdw访问数据需要先确保:网络通,数据库访问配置(sys_hba.conf)正常,同时远端数据库的用户必须有表的相关权限。
简述KINGBASE_FDW
创建扩展 kingbase_fdw
create extension kingbase_fdw;
创建远程Server
create server srv_test foreign data wrapper kingbase_fdw options(host '127.0.0.1',port '54321',dbname 'test');
创建User maping
create user mapping for kingbase server srv_test options (user 'kingbase', password '123456');
创建外部表
create foreign table public.test_tab01 (
id integer ,
c1 text
) server srv_test options (schema_name 'public', table_name 'tab01');
测试外部表
- 读取全部数据
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
本地与外部表的关联查询
本地表与外部表的关联查询
首先将外部表的数据缓存到本地,然后与本地表进行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
使用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利用数组改写查询
利用数组,可以一次性读取所需外部表的少量数据,即避免读取多余数据量,又防止多次建立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 跨库关联查询的更多相关文章
- T-SQL——关于跨库连接查询
目录 0. 同一台服务器不同数据库 1. 使用跨库查询函数--OpenDataSource() 2. 使用链接服务器(Linking Server) 3. 使用OpenDataSource()函数和链 ...
- oracle跨库连接查询
一.授权(本地客户器端授权当前用户) grant create database link to szfile 第一种连接方法:配置本地数据库服务器的tnsnames.ora文件 SZFILE = ( ...
- 2020-07-07:mysql如何实现跨库join查询?
福哥答案2020-07-07: 1.同服务跨库.表名称带上库名.SELECT * FROM 数据库名称1.表名称 JOIN 数据库名称2.表名称 ON 数据库名称1.表名称.tid = 数据库名称2. ...
- Mysql的跨服务器 关联查询--Federated引擎
1.确认开启Federated引擎 查询FEDERATED功能是否开启: show ENGINES; 2.如果状态为NO则需修改my.ini文件,增加一行federated配置: ...
- springboot整合mybatis进行跨库查询
业务场景: 当一个公司大了之后就会将各种业务进行分开,最简单的就是例如:公司的机构表,那么就会将他们分成开来,那么就会在一个实例中, 如果要获取相关信息就会去关联这张表进行关联查询 从而导致了跨库关联 ...
- 如何玩转跨库Join?跨数据库实例查询应用实践
背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...
- mysql 跨库查询问题
MySQL实现跨服务器查询 https://blog.csdn.net/LYK_for_dba/article/details/78180444 mysql> create database l ...
- mysql跨库联表查询
首先要了解database与instance区别,见<MySQL中的实例.数据库关系简介> 跨库分为同一个instance下的跨库和不同instance下的跨库. 一.同一个MySQL实例 ...
- 如何使用SQL SERVER数据库跨库查询
SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...
- SQL Server跨库查询
方式一: 语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELEC ...
随机推荐
- Fiddler捕获Java发送的HttpURLConnection请求
1.说明 平常使用Fiddler抓包工具查看浏览器的请求和响应信息很方便, 但有时候我们也需要拦截java代码执行的http请求. 以便更好的调试程序.具体方法如下: 2.编写Java代码 // 配置 ...
- 【Android 逆向】【攻防世界】boomshakalaka-3
1. apk 安装到手机,是一个cocos2dx 写的打飞机的游戏 题目描述跟得分有关(题目描述: play the game, get the highest score) 2. jadx 打开ap ...
- 硬件开发笔记(七): 硬件开发基本流程,制作一个USB转RS232的模块(六):创建0603封装并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了贴片电阻电容0603芯片封装,创建 ...
- AFNetworking整体框架简单整理
一.AFNetworking整体框架是怎样的 1.UIKit集成模块 UIKit 2.请求序列化 Serialization 3.响应序列化 Serialization 4.会话 NSURLSessi ...
- HTTP1.0/HTTP1.1/HTTP2.0的演进
HTTP1.0 短连接,每次请求都需要重新建立连接 不支持断点续传 HTTP1.1 支持长连接,同一个客户端连接可保持长连接,请求可在连接中顺序发出. 查看http请求头中有keepalive 参数 ...
- 【Azure 容器应用】在中国区Azure上创建的容器服务默认应用域名不全
问题描述 在中国区Azure上,创建Container App服务,发现默认的应用程序URL只有前半段,并不是一个完整的域名.这是什么情况呢? 正常的Container App的URL格式为:< ...
- Java 小练习 创建类 + 调用(1)
1 package com.bytezero.exer; 2 3 /** 4 * 5 * @Description 6 * @author Bytezero·zhenglei! Email:42049 ...
- WireShark学习笔记(一)
1.从WireShark分析网络层协议的传输 下面是网络接口层协议,从图中可以看到两个相邻设备的MAC地址,因此该网络包才能以接力的方式传送到目的地址. 下面是网络层,在这个包中,主要的任务是把TCP ...
- wsl使用记录
# wsl使用记录 安装 直接参考微软官方文档使用 WSL 在 Windows 上安装 Linux ubuntu可用发行版安装 https://ubuntu.com/wsl 访问 方式一:在资源管理器 ...
- DatePicker 日期选择器 split-panels 数组的时候,清空这个费劲啊,最后走的后门
这里的核心问题就是验证的时候value值不对,总是初始化的值,不论怎么设置,开始觉得是数组指针的问题,最后也不行,null也不行,组件的props都已经是null了,验证就是这么神奇,最后把this放 ...