查看: 533|回复: 4

[PL/SQL] 请问这段代码改写后会有性能提升么

[复制链接]
论坛徽章:
0
发表于 2020-3-21 13:27 | 显示全部楼层 |阅读模式
有两段代码,第一段是原始写法,第二种是我改写的,请问第二种在性能上可会有提升
--方式一
for each in (select * from dm_jcgz where dm like '2401%' and jctj is not null and  xybz='Y');
loop
...
end loop;

for each in (select * from dm_jcgz where dm like '2402%' and jctj is not null and  xybz='Y');
loop
end loop;

for each in (select  * dm_jcgz where (dm like '2406%' or dm like '2409%' or dm like '2411%' or dm like '2413%') and jctj is not null and  xybz='Y');
loop
end loop;



--方式二
declare
cursor c_test(in_dm varchar2)
is
select  * dm_jcgz where regexp_like(dm,in_dm) and jctj is not null and  xybz='Y';
begin
for v_dm in c_test('^2401')
loop
......
end loop;

for v_dm in c_test('^2402')
loop
......
end loop;


for v_dm in c_test('^2402')
loop
......
end loop;
for v_dm in c_test('^2402|^2409|^2411|^2413')
loop
......
end loop;

end;

认证徽章
论坛徽章:
223
2010新春纪念徽章
日期:2010-03-01 11:20:51ITPUB元老
日期:2019-04-25 13:46:07至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20管理团队2007贡献徽章
日期:2015-01-19 09:48:272015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04会员2007贡献徽章
日期:2015-02-03 10:26:41
发表于 2020-3-21 14:38 | 显示全部楼层
不会的,明显你这段代码的大量时间应该在 循环中,而不是这个 select 查询。 忽略掉吧

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2020-3-22 01:23 | 显示全部楼层
第一种反而更好,因为LIKE有可能用上索引。
如果对性能不满意,先搞清楚时间花在了哪里,到底是查询语句,还是循环体内部。

使用道具 举报

回复
论坛徽章:
20
秀才
日期:2018-05-22 16:17:26秀才
日期:2018-07-23 13:55:25秀才
日期:2018-07-23 13:55:25秀才
日期:2018-07-23 13:55:25秀才
日期:2018-07-23 13:55:25技术图书徽章
日期:2018-07-23 13:55:45蒙奇·D·路飞
日期:2018-08-06 09:43:02秀才
日期:2018-08-31 10:37:01秀才
日期:2018-11-13 14:57:26秀才
日期:2018-07-23 13:50:14
发表于 2020-3-23 10:45 | 显示全部楼层
不要用第二种方法(用不到索引)。第一种方法的问题是读表次数太多,完全可以用一个SQL实现,而且尽量不要用Or,建议用union all分开写,这么都可以用到索引(前提是在dm列上建立了索引)。
记住,凡是可以用一个SQL实现的,尽量用一个SQL,避免读表次数太多。

使用道具 举报

回复
论坛徽章:
20
秀才
日期:2018-05-22 16:17:26秀才
日期:2018-07-23 13:55:25秀才
日期:2018-07-23 13:55:25秀才
日期:2018-07-23 13:55:25秀才
日期:2018-07-23 13:55:25技术图书徽章
日期:2018-07-23 13:55:45蒙奇·D·路飞
日期:2018-08-06 09:43:02秀才
日期:2018-08-31 10:37:01秀才
日期:2018-11-13 14:57:26秀才
日期:2018-07-23 13:50:14
发表于 2020-3-23 10:53 | 显示全部楼层
还有,可不可以在表中新设计一个字段(此是高级冗余非低级冗余),仅保存如“2402,2406”等值的字段,而且在新字段中也建立索引;因模糊查询没用等值查询效率高。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时9.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表