LightDB - oracle_fdw join下推增强【24.1】

这篇具有很好参考价值的文章主要介绍了LightDB - oracle_fdw join下推增强【24.1】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

oracle_fdw join下推增强

oracle_fdw join下推特性(24.1之前)

在之前的版本中 oracle_fdw 支持对join 进行下推,但有如下的限制:

  • 只支持两表join的下推,不支持3表及以上的下推
  • 连接条件和where 条件可以下推
  • 如果连接被下推, order by 不会被下推
  • 没有连接条件的cross join 不会被下推
  • 只有select 语句支持连接下推
  • 表必须在同一外部服务器上
  • 只支持inner/seft/right/gull join 下推

oracle_fdw join增强特性(24.1)

从24.1版本开始, LightDB 支持对semi-join 进行下推,可以把semi-join转为exists 子查询下推到 Oracle 中。同时也支持对insert select语句中的join 进行下推。文章来源地址https://www.toymoban.com/news/detail-822678.html

测试

初始化环境

CREATE EXTENSION oracle_fdw;

-- TWO_TASK or ORACLE_HOME and ORACLE_SID must be set in the server's environment for this to work
CREATE SERVER oracle FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '', isolation_level 'read_committed', nchar 'true');

CREATE USER MAPPING FOR PUBLIC SERVER oracle OPTIONS (user 'SCOTT', password 'tiger');


SELECT oracle_execute(
          'oracle',
          E'CREATE TABLE t1(id number(10,0) primary key, val1 varchar(10), val2 char(10), val3 varchar2(10))'
       );

SELECT oracle_execute(
          'oracle',
          E'CREATE TABLE t2(id number(10,0) primary key, start_date number(10,0), val1 varchar(10), val2 char(10))'
       );

SELECT oracle_execute(
          'oracle',
          E'CREATE TABLE t3(start_date number(10,0) primary key, val1 varchar(10))'
       );

-- gather statistics
SELECT oracle_execute(
          'oracle',
          E'BEGIN\n'
          '   DBMS_STATS.GATHER_TABLE_STATS (''SCOTT'', ''T1'', NULL, 100);\n'
          'END;'
       );

SELECT oracle_execute(
          'oracle',
          E'BEGIN\n'
          '   DBMS_STATS.GATHER_TABLE_STATS (''SCOTT'', ''T2'', NULL, 100);\n'
          'END;'
       );

SELECT oracle_execute(
          'oracle',
          E'BEGIN\n'
          '   DBMS_STATS.GATHER_TABLE_STATS (''SCOTT'', ''T3'', NULL, 100);\n'
          'END;'
       );

CREATE foreign TABLE t1 (
    id number(10) OPTIONS (key 'yes') NOT NULL,
    val1 varchar(10),
    val2 char(10),
    val3 text
) SERVER oracle OPTIONS (table 'T1', force_pushdown_where_op 'true');

CREATE foreign TABLE t2 (
    id number(10) OPTIONS (key 'yes') NOT NULL,
    start_date number(10),
    val1 varchar(10),
    val2 char(10)
) SERVER oracle OPTIONS (table 'T2', force_pushdown_where_op 'true');

CREATE foreign TABLE t3 (
    start_date number(10) OPTIONS (key 'yes') NOT NULL,
    val1 varchar(10)
) SERVER oracle OPTIONS (table 'T3');


insert into t1 values(1, '1234', '1234','1234');
insert into t1 values(2, '2234', '2234','2234');
insert into t1 values(3, '2', '2','2');
insert into t1 values(4, '3', '3','3');
insert into t1 values(5, '4', '3','3');
insert into t1 values(6, '5', '3','3');

insert into t2 values(1, '20240118', 'abc', '2');
insert into t2 values(2, '20240118', 'qwe', '2');
insert into t2 values(3, '20240119', 'abc', '2');
insert into t2 values(4, '20240119', 'qwe', '3');
insert into t2 values(5, '20240121', 'zxc', '2');
insert into t2 values(6, '20240119', '', '3');

insert into t3 values('20240118', 'aaa');
insert into t3 values('20240119', 'bbb');
insert into t3 values('20240120', '');

create table t1_copy(
    id number(10) NOT NULL,
    val1 varchar(10),
    val2 char(10),
    val3 text
);

示例

lightdb@test_o=# explain (costs false) insert into t1_copy select * from t1 where exists (select * from t2 where t1.id=t2.id);
                                                                                       QUE
RY PLAN                                                                                   
     
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
-----
 Insert on t1_copy
   ->  Foreign Scan
         Oracle query: SELECT /*0354f41de5ae3cfec39f466b95199ae0*/ r3."ID", r3."VAL1", r3.
"VAL2", r3."VAL3" FROM "T1" r3 WHERE EXISTS (SELECT 1 FROM "T2" r4 WHERE (r3."ID" = r4."ID
") )
(3 rows)

lightdb@test_o=# explain (costs false) insert into t1_copy select t1.* from t1 join t2 on t1.id = t2.id;
                                                                             QUERY PLAN   
                                                                           
------------------------------------------------------------------------------------------
---------------------------------------------------------------------------
 Insert on t1_copy
   ->  Foreign Scan
         Oracle query: SELECT /*8198ab105b0cf1a88507da8440560abf*/ r3."ID", r3."VAL1", r3.
"VAL2", r3."VAL3" FROM ("T1" r3 INNER JOIN "T2" r4 ON (r3."ID" = r4."ID"))
(3 rows)

lightdb@test_o=# explain (costs false) insert into t1_copy select t1.* from t1 left join t2 on t1.id = t2.id;
                                                                             QUERY PLAN   
                                                                          
------------------------------------------------------------------------------------------
--------------------------------------------------------------------------
 Insert on t1_copy
   ->  Foreign Scan
         Oracle query: SELECT /*9590092cd58c52862a9f87d57d5cc7b0*/ r3."ID", r3."VAL1", r3.
"VAL2", r3."VAL3" FROM ("T1" r3 LEFT JOIN "T2" r4 ON (r3."ID" = r4."ID"))
(3 rows)

lightdb@test_o=# explain (costs false) insert into t1_copy select t1.* from t1 right join t2 on t1.id = t2.id;
                                                                             QUERY PLAN   
                                                                          
------------------------------------------------------------------------------------------
--------------------------------------------------------------------------
 Insert on t1_copy
   ->  Foreign Scan
         Oracle query: SELECT /*5b0638eb17c55e93456a02170c07ed6f*/ r3."ID", r3."VAL1", r3.
"VAL2", r3."VAL3" FROM ("T2" r4 LEFT JOIN "T1" r3 ON (r3."ID" = r4."ID"))
(3 rows)

lightdb@test_o=# explain (costs false) insert into t1_copy select t1.* from t1 full join t2 on t1.id = t2.id;
                                                                             QUERY PLAN   
                                                                          
------------------------------------------------------------------------------------------
--------------------------------------------------------------------------
 Insert on t1_copy
   ->  Foreign Scan
         Oracle query: SELECT /*0175371a65b00ef9b62ca21e1910774f*/ r3."ID", r3."VAL1", r3.
"VAL2", r3."VAL3" FROM ("T1" r3 FULL JOIN "T2" r4 ON (r3."ID" = r4."ID"))
(3 rows)

到了这里,关于LightDB - oracle_fdw join下推增强【24.1】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(二)

    界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(二)

    DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 本文中的内容概述了XAF跨平台.NET应用UI和DevExpress .NET App、Web A

    2024年04月23日
    浏览(52)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(22)
  • Oracle中LEFT JOIN后AND与WHERE的异同

    Oracle中LEFT JOIN后AND与WHERE的异同

    1、AND 过滤之后再连接 2、WHERE 连接之后再过滤 (1)、建表及插入测试数据 (2)、on后面and 条件表示先过滤之后,再连接 以下两种写法,所得的结果相同: (3)、on后面where条件表示先关联之后,再过滤   (4)、全值的情况   (5)、说明: 用到此类连接的情况,多为事实表为主表,维

    2024年02月10日
    浏览(10)
  • 浅述Oracle和Mysql两种库分别在join时大表的归宿

    突然想起这么一个问题,Oracle 和 Mysql 在各自关联大表的时候,要想性能高点,大表放的位置是不是一样的,针对这个问题,我查找了一些资料,并确定的该问题的结果。 在Oracle和MySQL中,对于JOIN语句,将大表放在JOIN语句的左侧或右侧都可以, 但是 由于查询优化器的不同实

    2024年02月04日
    浏览(22)
  • 51-32 CVPR’24 | 3DSFLabelling,通过伪自动标注增强 3D 场景流估计

    24 年 2 月,鉴智机器人、剑桥大学和上海交通大学联合发布CVPR\\\'24工作,3DSFLabelling: Boosting 3D Scene Flow Estimation by Pseudo Auto-labelling。 提出 3D 场景自动标注新框架,将 3D 点云打包成具有不同运动属性的 Boxes,通过优化每个 Box 运动参数并将源点云 Warp 扭曲到目标点云中,创建了

    2024年04月09日
    浏览(14)
  • oracle,获取每日24*60,所有分钟数

    oracle,获取每日24*60,所有分钟数

            为规范用户的时间录入,因此我们采用下拉的方式,让用户选择需要的时间,因此我们需要将一天24小时的时间拆分为类似00:00,00:01...23:00,23:01,23:59。因此我们需要生成24*60=1440行的下拉复选值。具体效果如下图所示。         哈哈哈,从数据的结构来看,又是树状的

    2024年02月15日
    浏览(9)
  • Oracle数据库19c OCP 1z0-082考场真题解析第24题

    Oracle数据库19c OCP 1z0-082考场真题解析第24题

    考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为云贝教育郭一军guoyJoe原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。【云贝教育】Oracle 19c OCP 082题库解析(24) - 课程体系 - 云贝教育 24.Which three statements are true reg

    2024年01月18日
    浏览(12)
  • POSTGRESQL中ETL、fdw的平行替换

    POSTGRESQL中ETL、fdw的平行替换

    “ 在我前两次的文章中,说到postgresql对于python的支持,其实很多功能也就可以封装进入的postgresql数据库中去。比如fdw、etl等,本文将以此为叙述点,进行演示展示” 在postgresql数据库中fdw的支持,在创建和使用上都不上太方便,特别是fdw在用表级别关联的时候,性能会大大

    2024年01月16日
    浏览(13)
  • 2023-01-13 LightDB分布式部署.md

    LightDB分布式部署 分布式部署模式 常规模式部署 1.服务器列表 命令行安装 问题

    2024年02月11日
    浏览(8)
  • MySQL 参考文档:SQL 语句优化(SELECT 语句优化)之索引条件下推(索引下推)优化

    索引下推优化官方文档说明 (Section 8.2.1.5):https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html 1. 什么是索引下推? qquad 索引条件下推 (Index Condition Pushdown,ICP) 是 MySQL 在使用索引从表中检索行时的一种优化方法。在没有 ICP 的情况下,存储引擎遍历索引以定位基

    2024年02月16日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包