首页 游戏 软件 资讯 排行榜 专题
首页
数据库
如何优化PLSQL中的SQL_减少上下文切换与Context Switch原理

如何优化PLSQL中的SQL_减少上下文切换与Context Switch原理

热心网友
87
转载
2026-04-30

PL/SQL里频繁调用SELECT为什么慢

根本原因在于,每一次SELECT语句的执行,都会触发一次SQL引擎与PL/SQL引擎之间的上下文切换。这并非数据库本身性能不足,而是两种执行环境在反复“交接工作”:PL/SQL在自己的栈上运行,一旦需要查询数据,就必须把控制权交给SQL引擎;等结果返回,再切换回来。单次切换开销不大,但如果在循环里写SELECT ... INTO v_x FROM t WHERE id = i;并执行上万次,累积起来的切换开销就相当可观了。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

典型的错误现象是:使用DBMS_PROFILERDBMS_HPROF分析时,会发现sql execute的耗时占比极高,但单独对那条SQL做EXPLAIN PLAN却显示执行很快;或者在AWR报告中看到parse time elapsedrecursive cpu usage指标异常偏高。

  • 常见场景:在循环中逐行查询配置表、进行数据校验或拼装数据(例如,在处理订单明细前,先循环查询每个客户的等级信息)。
  • 核心原理:PL/SQL引擎本身无法原生执行SQL,必须委托给SQL引擎处理,每次委托都会产生固定的上下文切换开销(大约2–5微秒,但乘以万次循环后,就会升级为毫秒级的延迟)。
  • 参数澄清:是否启用RESULT_CACHE对此类切换开销并无缓解作用——因为结果缓存优化的是数据检索本身,而非消除引擎间的切换过程。

BULK COLLECT批量取代替单行SELECT INTO

核心思路是将N次单行查询压缩为一次批量拉取,从而直接消除N-1次上下文切换。关键在于,不仅要改变语法,更要配合正确的集合类型和边界控制。

具体操作建议:

  • 首先声明集合类型,例如TYPE t_id_list IS TABLE OF NUMBER INDEX BY PLS_INTEGER;,若需兼容老版本,可使用INDEX BY BINARY_INTEGER
  • 使用BULK COLLECT INTO后,应立即检查集合的COUNT,避免因空集合导致后续逻辑出错。
  • 务必为大数据量游标添加LIMIT子句以防止内存溢出,例如:FETCH c1 BULK COLLECT INTO l_ids LIMIT 1000;
  • 注意:在BULK COLLECT之后,如果紧接着使用FORALL UPDATE操作同一张表,且未使用WHERE CURRENT OF子句,可能会引发ORA-01002(fetch out of sequence)错误。

参考代码片段:

DECLARE
  TYPE t_name_tab IS TABLE OF VARCHAR2(100);
  l_names t_name_tab;
BEGIN
  SELECT ename BULK COLLECT INTO l_names
     FROM emp WHERE deptno = 10;
  -- 后续直接遍历l_names集合即可,无需再执行单条查询
END;

什么时候该用FORALL而不是FOR循环+单条DML

FORALL的真正价值并非“让循环变快”,而是将N次独立的DML语句调用打包成一次对SQL引擎的批量调用,从而一次性规避掉N次的上下文切换、SQL解析以及执行计划重用判断。它主要负责发送指令,本身不处理返回值(除非使用SA VE EXCEPTIONS子句)。

实践中容易遇到的几个坑:

  • FORALL i IN 1..l_ids.COUNT语句中的索引必须是连续的。如果使用的集合是稀疏的(例如中间元素被DELETE过),则会触发ORA-22160错误。
  • FORALL语句不能嵌套,也不能放在IF分支里动态决定是否执行(会导致语法错误)。
  • 其绑定变量必须是集合类型,不能是标量。例如,FORALL i IN 1..n INSERT INTO t(x) VALUES (l_vals(i))是合法的;而直接使用VALUES (v_single)则是非法的。
  • 性能提示:如果未将PLSQL_OPTIMIZE_LEVEL参数设置为2(默认值),FORALL的优化效果可能会被削弱。

Context Switch在12c+的UTL_CALL_STACK里看不见?

是的,看不见。UTL_CALL_STACK仅用于反映PL/SQL内部的调用栈关系,它并不记录SQL引擎内部的执行动作。想要定量地观察上下文切换的开销,需要借助更底层的指标或工具:

  • 查询V$SESSTAT视图中的相关统计信息(准确的思路是,通过CPU used by this sessionDB CPU的差值,再结合execute count来间接推算)。
  • 使用DBMS_MONITOR.SESSION_TRACE_ENABLE开启10046级别的SQL跟踪,然后在跟踪文件中搜索PARSING IN CURSOREXEC #出现的频次——每一对通常就对应一次上下文切换。
  • 从19c版本开始,可以利用DBMS_HPROFFUNCTION层级更精确地看到sql execute的函数调用深度,这比旧版的DBMS_PROFILER更为准确。

真正棘手的是混合场景:例如,一个存储过程中既使用了BULK COLLECT进行批量操作,又夹杂了几处不得不进行的单次查询(比如获取系统时间戳、序列值)。在这种情况下,上下文切换并不会完全消失,只是其开销被整体性能提升所摊薄了。因此,优化重点不在于“彻底消灭”,而在于“精准识别并优化那些性价比最低、最不必要的切换点”。

来源:https://www.php.cn/faq/2336218.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

如何优化PLSQL中的SQL_减少上下文切换与Context Switch原理
数据库
如何优化PLSQL中的SQL_减少上下文切换与Context Switch原理

PL SQL里频繁调用SELECT为什么慢 根本原因在于,每一次SELECT语句的执行,都会触发一次SQL引擎与PL SQL引擎之间的上下文切换。这并非数据库本身性能不足,而是两种执行环境在反复“交接工作”:PL SQL在自己的栈上运行,一旦需要查询数据,就必须把控制权交给SQL引擎;等结果返回,再

热心网友
04.30
把NS2直接插坏!《识质存在》假卡带把玩家害惨了
游戏评测
把NS2直接插坏!《识质存在》假卡带把玩家害惨了

多年以来,电商平台售卖虚假电脑配件的乱象早已屡见不鲜,造假产品涵盖显卡、处理器等核心硬件。而如今这类假货问题不再局限于电脑硬件,掌机游戏卡带也沦为重灾区。 一名玩家在亚马逊仓库折扣渠道购入 Switch2 游戏,收货后发现竟是内部无任何元件的空壳卡带,强行取出后直接造成掌机硬件永久损坏。 这事儿得从

热心网友
04.28
女儿不听话妈妈怒砸Switch!网友秒开无限火力
游戏评测
女儿不听话妈妈怒砸Switch!网友秒开无限火力

近日,一位日本妈妈因女儿不听话弄坏女儿Switch的事件在网络引起热议,网友纷纷对这位妈妈展开教育。 网络上迅速形成了两种声音。大部分日本网友对此表达了明确的批评,认为这位母亲未能控制好自身情绪,砸毁物品的行为本身就存在问题。单纯从经济损失角度看,这已是一种浪费;但更关键的是,此类过激举动很可能给孩

热心网友
04.28
Amazon Gaming Week 期间 Nintendo Switch 游戏最佳优惠汇总
游戏攻略
Amazon Gaming Week 期间 Nintendo Switch 游戏最佳优惠汇总

Amazon Gaming Week:任天堂Switch第一方游戏罕见大促,数字版入手良机 任天堂Switch的第一方游戏打折?这事儿可不常见。但就在这次的Amazon Gaming Week,它真的发生了。过去五年里那些口碑与分量俱佳的重磅作品,纷纷给出了33%到40%的折扣,对于一直等待数字版优

热心网友
04.28
到底该选谁?《数码宝贝物语:时空异客》Switch 2与Switch版本实测 差距一目了然
游戏评测
到底该选谁?《数码宝贝物语:时空异客》Switch 2与Switch版本实测 差距一目了然

《数码宝贝物语:时空异客》双版本差异解析:Switch 2与Switch,到底怎么选? 今年夏季,《数码宝贝物语:时空异客》将同时登陆Nintendo Switch 2和Switch平台。不少玩家心里都在嘀咕:这两个版本究竟有何不同?为了让大家看得更明白,我们结合外媒nintendoeverythi

热心网友
04.26

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

小米SU7车主引奥迪互动,新老品牌山脊赛道共赴热爱
娱乐
小米SU7车主引奥迪互动,新老品牌山脊赛道共赴热爱

2026年4月2日,一场始于订单的“双向奔赴” 汽车圈最近上演了一出颇有温度的品牌互动,起因是一张来自社交平台的购车订单。一位原奥迪车主公开晒出了小米SU7的订单截图,并向相关负责人致以问候。这原本只是一条个人动态,却没承想,引发了一连串超出预期的友好回应。 消息传出后,上汽奥迪的反应堪称迅速且巧妙

热心网友
04.30
特斯拉2026年Q1电动车产销双增,加速布局Robotaxi与人形机器人量产
娱乐
特斯拉2026年Q1电动车产销双增,加速布局Robotaxi与人形机器人量产

特斯拉2026年Q1财报解读:业绩稳健增长,自动驾驶与机器人战略加速落地 2026年第一季度,特斯拉再次向市场展示了其强劲的发展动能。在全球电动汽车市场,特斯拉产量成功突破40 8万辆,实现同比12 7%的稳健增长;同期交付量达到35 8万辆,同比增长6 5%。与此同时,特斯拉储能业务表现突出,总装

热心网友
04.30
我的世界愚人节更新移除仓库系统,地面直取物品引热议
娱乐
我的世界愚人节更新移除仓库系统,地面直取物品引热议

四月一日,沙盒游戏我的世界推出一次特别更新,引发广泛关注 话说回来,四月的第一天,经典沙盒游戏《我的世界》,就整了个“大活儿”。一项听起来颇有碘伏性的设计调整,在社区内炸开了锅:游戏直接移除了沿用已久的仓库系统,改为所有物品都能随手放在地面,想用的时候捡起来就行。 仓库功能向来是此类建造型游戏的核心

热心网友
04.30
某巨鲸从Kraken提取4,472枚ETH,当前持仓市值约2,000万美元
web3.0
某巨鲸从Kraken提取4,472枚ETH,当前持仓市值约2,000万美元

巨鲸再出手:千万美元级ETH悄然离场 市场总是静水深流。就在今天,链上数据捕捉到一笔值得玩味的动向。根据链上分析师Onchain Lens的监测,大约三小时前,一个地址尾号为“24d4”的巨鲸,从知名交易所Kraken一口气提取了4,472枚ETH。按当前市价估算,这笔资产价值接近一千万美元。 这可

热心网友
04.30
京东京造推黄金气囊磁吸支架:含1克99.99%黄金,售价1199元
娱乐
京东京造推黄金气囊磁吸支架:含1克99.99%黄金,售价1199元

京东京造再推黄金配件新品:磁吸支架以亲民价格亮相 关注京东京造的朋友一定还记得此前推出的黄金手机壳,因其独特设计与高纯度金材质引发了不少讨论。如今品牌再度升级,带来了一款更贴近日常使用的“轻量化”黄金配件——黄金气囊手机磁吸支架,进一步降低了黄金数码配件的入手门槛。 产品解析:含金量与设计亮点 这款

热心网友
04.30