LightDB - oracle_fdw 过滤条件下推增强【24.1】

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

LightDB 在24.1版本对oracle_fdw 的where下推进行了增强,新增对如下两种情况进行下推:

  • 字符串比较下推,如 a >‘100’ 这种,具体见下面示例
  • 隐式转换为numeric 类型情况下的下推
  • 新增 nvl 和 trim 函数下推

1. 字符串比较下推

oracle_fdw 不支持字符串比较下推是因为 LightDB 和 Oracle 的排序规则可能不同,下推和不下推的结果可能不同,因此不进行下推。
但对于某些场景,比如字符串都是数字,是个id, 那么不管什么排序规则,大小比较都是相同的。因此 LightDB 提供了一个表级别的选项来支持强制下推这种情况。
选项为:force_pushdown_where_op
可以设置为:on/yes/true 或者 off/no/false

1.1 示例

lightdb@test_o=# CREATE foreign TABLE t1 (
    id number(10) NOT NULL,
    val1 varchar(10),
    val2 char(10),
    val3 text
) SERVER oradb OPTIONS (table 'T1');
CREATE FOREIGN TABLE
lightdb@test_o=# explain (costs false) select * from t1 where val1 > '1';
                                                    QUERY PLAN                   
                                  
---------------------------------------------------------------------------------
----------------------------------
 Foreign Scan on t1
   Filter: ((val1)::text > '1'::text)
   Oracle query: SELECT /*c1f143f0d9e74f29fb779e0a2ccfbe91*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1
(3 rows)

lightdb@test_o=#  alter foreign table t1 OPTIONS (add force_pushdown_where_op 'true');
ALTER FOREIGN TABLE
lightdb@test_o=# explain (costs false) select * from t1 where val1 > '1';
                                                                QUERY PLAN       
                                                          
---------------------------------------------------------------------------------
----------------------------------------------------------
 Foreign Scan on t1
   Oracle query: SELECT /*d1d07899c1c6cc550f34054b7ba97384*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (r1."VAL1" > '1')
(2 rows)

lightdb@test_o=# drop foreign TABLE t1;
DROP FOREIGN TABLE
lightdb@test_o=# CREATE foreign TABLE t1 (
    id number(10) NOT NULL,
    val1 varchar(10),
    val2 char(10),
    val3 text
) SERVER oradb OPTIONS (table 'T1', force_pushdown_where_op 'true');
CREATE FOREIGN TABLE
lightdb@test_o=# explain (costs false) select * from t1 where val1 > '1';
                                                                QUERY PLAN       
                                                          
---------------------------------------------------------------------------------
----------------------------------------------------------
 Foreign Scan on t1
   Oracle query: SELECT /*d1d07899c1c6cc550f34054b7ba97384*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (r1."VAL1" > '1')
(2 rows)

2. 隐式转换下推

对于如下SQL,原先是不会下推的:

select * from t1 where val1 > 1;

因为val1 是字符类型, 与 1 比较, 在LightDB 中 val1 会被隐式转换为 numeric 类型。
下面是支持下推此情况的示例(转换为cast (val1 as numebr) 下推):

2.1 示例

lightdb@test_o=# explain (costs false) select * from t1 where val1 > 1;
                                                                       QUERY PLAN
                                                                        
---------------------------------------------------------------------------------
------------------------------------------------------------------------
 Foreign Scan on t1
   Oracle query: SELECT /*1057989d07288e060655a4377d7d36ef*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (cast(r1."VAL1" as number) > 1)
(2 rows)

lightdb@test_o=# explain (costs false) select * from t1 where val1::number > 1;
                                                                       QUERY PLAN
                                                                        
---------------------------------------------------------------------------------
------------------------------------------------------------------------
 Foreign Scan on t1
   Oracle query: SELECT /*1057989d07288e060655a4377d7d36ef*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (cast(r1."VAL1" as number) > 1)
(2 rows)
          

3. nvl 和trim 下推

在 LightDB 中 trim 会转换为 ltrim, rtrim 和 btrim 函数执行,原先已支持 ltrim, rtrim 函数的下推,24.1 支持了对btrim 的下推,也即完全支持了 trim 的下推。文章来源地址https://www.toymoban.com/news/detail-809493.html

3.1 示例

lightdb@test_o=# explain (costs false) select * from t1 where nvl(val1,' ') = 'abc' order by id;
                                                                                 
     QUERY PLAN                                                                  
                     
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
---------------------
 Foreign Scan on t1
   Oracle query: SELECT /*49625285d521d9e84167b4358a1b57b0*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (nvl(r1."VAL1", ' ') = 'abc') ORDER BY r1
."ID" ASC NULLS LAST
(2 rows)

lightdb@test_o=# explain (costs false) select * from t1 where trim(val1) = 'abc' order by id;
                                                                                 
          QUERY PLAN                                                             
                               
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
-------------------------------
 Foreign Scan on t1
   Oracle query: SELECT /*ad50eef72115ae7525aaaf08663b014c*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (TRIM(BOTH ' ' FROM r1."VAL1") = 'abc') O
RDER BY r1."ID" ASC NULLS LAST
(2 rows)

lightdb@test_o=# explain (costs false) select * from t1 where trim(LEADING val1) = 'abc' order by id;
                                                                                 
      QUERY PLAN                                                                 
                       
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
-----------------------
 Foreign Scan on t1
   Oracle query: SELECT /*e2c065886aa1e3ccb9cc00faa85f9f95*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (ltrim(r1."VAL1", ' ') = 'abc') ORDER BY 
r1."ID" ASC NULLS LAST
(2 rows)

lightdb@test_o=# explain (costs false) select * from t1 where trim(TRAILING val1) = 'abc' order by id;
                                                                                 
      QUERY PLAN                                                                 
                       
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
-----------------------
 Foreign Scan on t1
   Oracle query: SELECT /*4fc7fba86ff56a97069e1102f988519f*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (rtrim(r1."VAL1", ' ') = 'abc') ORDER BY 
r1."ID" ASC NULLS LAST
(2 rows)

lightdb@test_o=# explain (costs false) select * from t1 where nvl(trim(val1),' ') = 'abc' order by id;
                                                                                 
               QUERY PLAN                                                        
                                         
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
-----------------------------------------
 Foreign Scan on t1
   Oracle query: SELECT /*77db51933cdfa1dd6edc39f35a00f952*/ r1."ID", r1."VAL1", 
r1."VAL2", r1."VAL3" FROM "T1" r1 WHERE (nvl(TRIM(BOTH ' ' FROM r1."VAL1"), ' ') 
= 'abc') ORDER BY r1."ID" ASC NULLS LAST
(2 rows)

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

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

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

相关文章

  • PHP elasticsearch 条件过滤、排序、高亮实现

    php在做搜索引擎时,进程要对结果进行筛选,所以我们这里记录一下elasticsearch 条件过滤、排序、高亮实现。在创建索引时如果使用了mapping映射,请将要过滤和排序的字段index设置为true ok,搞定! php写搜索时注意:多个筛选条件时,term、range外面还有一层[],高亮需指定字段,

    2023年04月21日
    浏览(27)
  • Java - Stream Filter 多条件筛选过滤

    Java Stream流中Filter用于通过设置的条件过滤出元素 ,示例如下: 如果需要进行多条件过滤 我们可以对这些参数进行处理,我们只是需要做一下判断,即: 让所有参数默认为 false,然后对传进来的值进行取值判断,若满足该条件为true,多个条件进行多次判断 判断完成之后 会

    2024年02月04日
    浏览(44)
  • ES实现三表关联查询+条件过滤

            很多时候mysql的表之间是一对多的关系,比如库信息表(元数据信息),表信息表(元数据信息),字段信息表(元数据信息)。一个库可以包含多个表,一个表可以包含多个字段。他们的关系:库—(1:n)-表—(1:n)-字段。         ElasticsSearch(以下简称ES)处

    2024年02月05日
    浏览(31)
  • ElasticSearch系列 - SpringBoot整合ES:查询条件 query 和过滤条件 filter 的区别

    01. Elasticsearch 查询条件和过滤条件的区别? Elasticsearch中的查询条件和过滤条件都是用于搜索和过滤文档的条件,但它们之间有一些区别。 查询条件是用于计算文档相关度得分的条件,它会将所有符合条件的文档按照相关度得分从高到低排序,并返回前N个文档。查询条件可以

    2024年02月14日
    浏览(45)
  • 02、Oracle过滤和排序数据

    where 子句中的条件有许多形式, 只有表中符合这些条件的行才会返回。 where 子句中不可以使用列的别名。 如果条件列是数字型的, 可以直接写; 如果条件列是字符型的, 需要使用单引号; 如果条件列是日期型的, 要注意日期格式, 单引号。 需求: 查询 10号部门的员工

    2023年04月12日
    浏览(25)
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤

    之前介绍了SpringBoot集成Jpa的简单使用,接下来介绍一下使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作。首先创建Springboot工程并已经继承JPA依赖,如果不知道可以查看我的另一篇文进行学习,这里不做介绍。文章地址(https://www.cnblogs.com/eternality/p/17391141.htm

    2024年02月04日
    浏览(32)
  • Oracle删除约束条件不会锁表

    最近有个需求要删除一个Oracle约束条件,但是由于不知道会不会锁表,所以测试了一下 使用python写了段代码验证下 程序一直执行,删除约束条件没有任何压力 技术无止境

    2024年02月16日
    浏览(35)
  • 04、Oracle转换函数和条件表达式

    隐式转换: 数据类型与默认格式匹配 1.1.3.1带有日期的 TO_CHAR 双引号:格式中字符串不是格式掩码时 FM : 去除开头和结尾的空格 ( 显示紧凑 ) 都可以用 格式模型:日期格式掩码 官方文档位置: SQL Language Reference - 5 Functions - CTRL+F 搜索 to_char - TO_CHAR (datetime) - Format Models - Table

    2023年04月16日
    浏览(43)
  • FQPF27P06 P沟道增强型MOS管电压、原理、导通条件!

    关于P沟道增强型功率MOSFET? P沟道增强型功率MOSFET是一种常见的功率场效应晶体管,它主要用于功率放大和开关电路。与N沟道增强型MOSFET相比,P沟道增强型MOSFET的工作原理相反。 在P沟道增强型MOSFET中,沟道区域是由P型材料形成的。当施加正电压到晶体管栅极上时,电场会

    2024年02月11日
    浏览(27)
  • 安装oracle 11g,先决条件检查失败问题解决方法

    1.1 先决条件检查失败 在安装oracle 11g时,出现执行先决条件失败的情况如下: 你可以点击全部忽略,继续强制安装,一般不会影响功能,

    2024年02月08日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包