Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Oracle Database 23ai 中的 SQL Transpiler

Oracle Database 23ai 中的 SQL Transpiler

作者头像
Yunjie Ge
发布于 2025-03-27 09:02:42
发布于 2025-03-27 09:02:42
8500
代码可运行
举报
文章被收录于专栏:数据库与编程数据库与编程
运行总次数:0
代码可运行

在 Oracle Database 23ai 中,引入了一项非常有价值的功能 —— SQL Transpiler。该功能旨在通过将 PL/SQL 函数自动转换为 SQL 表达式,来减少 SQL 查询中函数调用的开销,使得数据库在处理复杂查询时能够更高效地利用底层执行引擎,提高查询执行效率,从而在复杂数据处理场景下获得更好的性能表现。无论是在单实例环境还是在多实例(如 RAC)环境中,该功能都为开发者提供了灵活的性能调优工具。对于那些依赖大量函数调用的应用程序来说,合理利用 SQL Transpiler 不仅能降低系统资源消耗,还能显著提升整体响应速度,是一个非常值得关注的优化特性。

功能优势

在传统的数据库开发过程中,很多开发者习惯于将业务逻辑写在 PL/SQL 中,借助存储过程、函数来实现数据计算和处理。然而,PL/SQL 与 SQL 查询之间的切换往往会带来额外的性能消耗。Oracle 23ai 中的 SQL Transpiler 就是为了解决这一问题而设计的。通过自动转换 PL/SQL 函数为 SQL 表达式,数据库引擎可以直接在 SQL 级别处理计算逻辑,从而降低函数调用的额外开销,同时还使查询优化器能够更好地优化执行计划。

具体来说,SQL Transpiler 能够在无需用户过多干预的情况下,将在 SQL 查询中调用的某些 PL/SQL 函数进行转换。这样一来,原本复杂的函数调用就可以被简化为标准的 SQL 算术运算或其他 SQL 表达式,大大提升了 SQL 查询的执行速度和整体响应能力。

参数说明

Oracle Database 为 SQL Transpiler 提供了一个名为 SQL_TRANSPILER 的初始化参数。该参数可以在会话级别或系统级别进行设置,以便灵活控制 SQL Transpiler 的启用状态。

当该参数设置为 ON 时,Oracle 数据库会自动尝试将存储在数据库中的 PL/SQL 函数转换为 SQL 表达式;而设置为 OFF 则表示禁用这一转换功能。在多实例环境中,如 Oracle RAC,不同的实例可以根据实际需求分别启用或禁用 SQL Transpiler,从而实现灵活的资源调度和负载均衡

转换机制

SQL Transpiler 主要针对那些在 SQL 查询中经常被调用的 PL/SQL 函数。通过分析函数内部的逻辑,系统会判断是否可以将其直接转换为 SQL 运算。例如,如果函数内仅包含简单的算术运算或字符串处理,SQL Transpiler 就会将其转换为相应的 SQL 表达式。这样不仅能够减少上下文切换带来的性能损耗,还能使查询计划更加简洁明了,便于数据库优化器进行更高效的执行计划生成。

在转换过程中,Oracle 会对函数内部的表达式进行语义分析和安全性检查,确保转换后的 SQL 表达式在逻辑上与原有的 PL/SQL 函数保持一致,并且不会引入潜在的安全隐患或错误。

示例

在实际应用中,SQL Transpiler 的优势在于其能够简化对存储过程和函数的调用逻辑,尤其是在数据量较大或查询复杂度较高的情况下,其优化效果尤为明显。

初始化数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
drop table if exists test1;
create table t1 (
  id    number,
  col1  number,
  col2  number
);
insert into t1 (id, col1, col2)
values (1, 1, 2), (2, 10, 20), (3, 100, 200);
commit;

以下示例展示了在未启用和启用 SQL Transpiler 时查询执行计划的对比:

未启用 SQL Transpiler 时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select id, col1, col2 from   test1
where  add_numbers(col1, col2) = 300;


select * from   dbms_xplan.display_cursor();

SQL_ID  f38z6t91fvrun, child number 0
-------------------------------------
select id, col1, col2 from   test1 
where  add_numbers(col1, col2) = 300

Plan hash value: 4122059633

---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |       |       |     3 (100)|          |
|*  1 |  TABLE ACCESS FULL| TEST1 |     1 |    39 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("ADD_NUMBERS"("COL1","COL2")=300)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

在上述示例中,查询中直接调用了 ADD_NUMBERS 函数,因此在执行计划中仍然可以看到对该函数的调用,从而增加了额外的计算开销。

启用 SQL Transpiler 后:

为了验证 SQL Transpiler 的效果,我们可以通过修改会话参数为 ON 来启用这一功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter session set sql_transpiler = 'ON';

select id, col1, col2 from  test1
where  add_numbers(col1, col2) = 300;

select * from   dbms_xplan.display_cursor();

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID  dcttgua9qy5x4, child number 0
-------------------------------------
select id, col1, col2 from  test1 
where  add_numbers(col1, col2) = 300

Plan hash value: 4122059633

-------------------------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |       |       |     3 (100)|          |
|*  1 |  TABLE ACCESS FULL| TTEST11   |     1 |    39 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL1"+"COL2"=300)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)


22 rows selected.

SQL>

可以看到,启用 SQL Transpiler 后,原来通过函数 ADD_NUMBERS 实现的计算逻辑已经被转换为直接的 SQL 表达式 "COL1" + "COL2"=300。这一转换有效消除了函数调用的额外成本,从而有助于简化执行计划和提高查询性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山东Oracle用户组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Oracle表连接学习笔记
内连接:指表连接的结果只包含那些完全满足连接条件的记录。下面学习一下内连接的,给个例子,这里创建两张表,然后用内连接方式查询,看看例子:
SmileNicky
2019/06/25
9200
【DB笔试面试597】在Oracle中,获取执行计划有哪几种方法?
AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性。启用AUTOTRACE后,SQL*Plus会自动收集执行过的SQL语句的执行计划、性能统计数据等,并在语句执行结束后显示在SQL*Plus中。
AiDBA宝典
2019/09/29
6060
【DB笔试面试597】在Oracle中,获取执行计划有哪几种方法?
Oracle优化05-执行计划
如果要分析某条SQL的性能问题,通常来讲,我们首先要看SQL的执行计划,看看SQL的每一步执行计划是否存在问题。
小小工匠
2021/08/16
7930
Oracle 执行计划查看方法汇总及优劣比较
执行计划是一条 SQL 语句在 Oracle 数据库中的执行过程或访问路径的描述。如下图所示,是一个比较完整的执行计划示意图。
JiekeXu之路
2022/12/07
1.5K0
Oracle 执行计划查看方法汇总及优劣比较
查看Oracle执行计划的几种常用方法-系列1
SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向。
bisal
2019/01/29
7740
【DB笔试面试517】在Oracle中,什么是临时表?它有哪些分类?有关临时表需要注意什么?
目前所有使用Oracle作为数据库支撑平台的应用,大部分是数据量比较庞大的系统,即表的数据量级一般情况下都是在百万级以上。当然,在Oracle中创建分区是一种不错的选择,但是当发现应用有多张表关联的时候,并且这些表大部分都比较庞大,而关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小,并且查询得到这个结果集的速度非常快,那么这个时候考虑在Oracle中创建“临时表”。
AiDBA宝典
2019/09/29
1.2K0
【DB笔试面试582】在Oracle中,什么是绑定变量窥探(上)?
目标SQL若不使用绑定变量,则当具体输入值一旦发生了变化,目标SQL的SQL文本就会随之发生变化,这样Oracle就能很容易地计算出对应Selectivity和Cardinality的值,进而据此来选择执行计划。但对于使用了绑定变量的目标SQL而言,情况就完全不一样了,因为现在无论对应绑定变量的具体输入值是什么,目标SQL的SQL文本都是一模一样的。对于使用了绑定变量的目标SQL而言,Oracle可以选择如下两种方法来决定其执行计划:
AiDBA宝典
2019/09/29
1.5K0
Oracle 绑定变量窥探
    Bind Peeking是Oracle 9i中引入的新特性,一直持续到Oracle 10g R2。它的作用就是在SQL语句硬分析的时候,查看一下当前SQL谓词的值 ,以便生成最佳的执行计划。而在oracle 9i之前的版本中,Oracle 只根据统计信息来做出执行计划。
Leshami
2018/08/14
1.7K0
Oracle之SQL优化专题01-查看SQL执行计划的方法3.1 dbms_xplan.display_cursor(null,null,'allstats last')3.2 dbms_xplan.
在我2014年总结的“SQL Tuning 基础概述”中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执行计划的方法。 本文示例SQL为: --set lines 1000 pages 1000 select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788; 1.explain
Alfred Zhao
2018/05/11
1.7K0
读书笔记-《基于Oracle的SQL优化》-第二章-1
1、目标SQL的正文、SQL ID和其执行计划所对应的的PLAN HASH VALUE。
bisal
2019/01/29
9370
【DB笔试面试570】在Oracle中,SQL优化在写法上有哪些常用的方法?
一般在书写SQL时需要注意哪些问题,如何书写可以提高查询的效率呢?可以从以下几个方面去考虑:
AiDBA宝典
2019/09/29
3.6K0
【DB笔试面试582】在Oracle中,什么是绑定变量窥探(下)?
若启用了绑定变量窥探且WHERE条件为“目标列 BETWEEN X AND Y”的selectivity计算公式为:
AiDBA宝典
2019/09/29
1.2K0
【DB笔试面试642】在Oracle中,什么是基数反馈(Cardinality Feedback)?
基数反馈(Cardinality Feedback,CFB)是Oracle 11gR2出现的一个新特性,它的出现是为了帮助Oracle优化器依据更精准的基数生成更加优秀的执行计划。基数的评估准确与否,对于优化器异常重要,直接影响到后续的JOIN COST等重要的成本计算评估。若评估不当则会造成CBO选择不当的执行计划。此技术对于仅执行一次的SQL无效,在SQL第一次执行时,记录存储实际的基数和评估的基数之间的差异,如果差异较大,在第二次执行时,优化器会依据实际的基数重新决策生成执行计划,但是需要注意的是,当使用更准确的基数重新生成执行计划时,生成的执行计划与第一次时使用的执行计划完全有可能是相同的。这个技术的出现是由于优化器在一些情况下不能很好的去计算基数的数值,比如:统计信息缺失或陈旧、多谓词、直方图缺失等等。
AiDBA宝典
2019/09/29
7830
一次有意思的错选执行计划问题定位(涉及SYS_OP_C2)
1. 11g的库,话说有一个应用程序新上线,应用中使用了绑定变量的方式执行一条简单的SQL,例如select a from b where c = :x,c列是该表复合主键的前导列,表定义是varchar2类型,从spotlight监控看这条SQL的执行计划是全表扫描,一次执行要1个小时,这张表是运行很久的引用分区表,数据量是亿级,测试的时候正常,但很显然测试的数据量可能和生产非常不一致,导致没察觉。
bisal
2019/01/29
6340
六千字带你了解 Oracle 统计信息和执行计划
前几天,微信上收到《Oracle DBA工作笔记》、《MySQL DBA工作笔记》作者,DBAplus社群联合发起人杨建荣老师的邀请,说在他的 QQ 群里分享一下技术类、职场类、感悟类的文章,我顿时感到诚惶诚恐,荣幸之至,分享也是一个学习的过程呀,便欣然答应了杨老师的邀请。想着最近也在学习优化相关的东西,那就一边学习一边总结分享,文中如有其它不到之处,还请多多指教。
JiekeXu之路
2020/04/20
2.9K0
[Oracle]-[sqlplus相关]-serveroutput参数
select /*+ no_index(t1 idx_t1) */ * from t1 where n=3; select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
bisal
2019/01/29
1.1K0
【DB笔试面试598】在Oracle中,如何得到真实的执行计划?
在Oracle数据库中判断得到的执行计划是否准确,就是看目标SQL是否被真正执行过,真正执行过的SQL所对应的执行计划就是准确的,反之则有可能不准,因此,通过10046事件及如下的几种方式得到的执行计划是最准确的,而从其它方式获取到的执行计划都有可能不准确。
AiDBA宝典
2019/09/29
7100
视图 v$sql,v$sqlarea,$sqltext,v$sqltext_with_newlines 的差异
      视图v$sql,v$sqlarea,v$sqltext,v$sqltext_with_newlines 是几个经常容易混淆的视图,主要是提供library cache中当前缓存的sql语句的信息。这几个视图都可以提供当前有关sql语句的具体信息,但稍有差异。本文主要描述其差异并给出实例。
Leshami
2018/08/14
1.1K0
【DB笔试面试610】在Oracle中,SPM的使用有哪些步骤?
这次正确的使用了索引。因为只有标记为ENABLE和ACCEPT的plan才可以被使用。
AiDBA宝典
2019/09/29
1.2K0
dbms_xplan之display_cursor函数的使用
        DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实 的执行计划有助于更好的分析SQL语句的全过程,尤其是运行此SQL语句实时的I/O开销。通过对比预估的I/O与真实的I/O开销来判断SQL语句所存 在问题,如缺少统计信息,SQL语句执行的次数,根据实际中间结果集的大小来选择合适的连接方式等。本文仅仅讲述display_cursor函数的使 用。         有关执行计划中各字段模块的描述请参考: 执行计划中各字段各模块描述         有关由SQL语句来获取执行计划请参考:     使用 EXPLAIN PLAN 获取SQL语句执行计划         有关使用autotrace来获取执行计划请参考: 启用 AUTOTRACE 功能         有关dbms_xplan之display函数请参考:     dbms_xplan之display函数的使用 一、display_cursor函数用法 1、display_cursor函数语法
Leshami
2018/08/14
1.1K0
推荐阅读
相关推荐
Oracle表连接学习笔记
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文