oracle SQL语句硬编码带来的问题以及解决办法
好久没有写博客(吹nb)了,最近在工作中遇到了一些SQL硬编码的问题(系统部提出的要求,要求开发优化sql),下面具体说说。
1、硬解析即整个SQL语句的执行需要完完全全的解析,生成执行计划。
硬解析过程:
1.语法、语义及权限检查;
2.查询转换(通过应用各种不同的转换技巧,会生成语义上等同的新的SQL语句,如count(1)会转为count(*));
3.根据统计信息生成执行计划(找出成本最低的路径,这一步比较耗时);
4.将游标信息(执行计划)保存到库缓存。
2、软解析过程:
1.语法、语义及权限检查;
2.将整条SQL hash后从库缓存中执行计划。
软解析对比硬解析省了三个步骤。
3、总结:
1.尽可能的避免硬解析,因为硬解析需要更多的CPU资源,闩等。
2.cursor_sharing参数应权衡利弊,需要考虑使用similar与force带来的影响。
3.尽可能的使用绑定变量来避免硬解析。
生产环境中遇到的问题,系统上线一段时间后,监控发现某些语句很占内存:
可以用sql语句查询(需要DBA权限): select * from v$sql where sql_text like %表名%; 也可以不用条件,主要是查看的字段有sql_text,sql_fullText,sharable_mem(占用的共享内存大小,单位字节),presistent_mem(生命期类的固定内存大小,单位字节),runtime_mem(执行期内的固定内存大小); 具体可以参考https://blog.csdn.net/rnhhb/article/details/102791065;
硬解析产生的源头:编写sql语句不规范(包括通过java中编写的sql语句和oracle库中存储过程的sql语句),举一个简单的例子:
通过用户名和密码查询表user_Info表中的用户信息:"select * from user_info where user_name = "+ name +" and password="+password 【java中的错误写法】 这种写法虽然也能查询出来数据,但是存在问题:1.sql注入风险,2.会产生硬解析的问题。那么应该怎么解决呢?参数化:"select * from user_info where user_name =:1 and password=:2 " ,通过占位符的方式解决【正确的写法】。
oracle存储过程中的写法【会产生硬解析】:
create or repalce prodece A (name in varchar,outreslut out sys_refcursor)begin
v_sql varchar(2000) :="select * from user_info where user_name = "||name;
OPEN outreslut for v_sql USING name;
end A;
oracle存储过程中的写法【解决硬解析】:
create or repalce prodece A (name in varchar,outreslut out sys_refcursor)begin
v_sql varchar(2000) :="select * from user_info where user_name =:1 ";
--- execute immediate v_update_sql USING name;(针对修改的);
--查询
OPEN outreslut for v_sql USING name;
end A;
综上所述:不要将参数拼接sql中,除非,参数是比较固定的值(或者变化频率不大(不超过10次)),应该采用参数化,通过参数占位符的方式传入参数。
另外可以参考博客:https://blog.csdn.net/leshami/article/details/6195483
oracle SQL语句硬编码带来的问题以及解决办法相关推荐
- oracle sum函数返回空,关于SQL语句中SUM函数返回NULL的解决办法
SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...
- 从sql文件中读取sql语句执行后报语法错误问题的解决办法
一般的sql文件保存时都为UTF-8编码,默认(如果sql文件中有中文字符)会有一个BOM头,读取并执行的时候会报syntax error语法错误(这个错误搞了好几天,郁闷),这个时候需要将sql文件 ...
- oracle中子查询的执行顺序是,Oracle sql语句执行顺序
sql语法的分析是从右到左 一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...
- Oracle sql语句执行顺序
一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的 ...
- Oracle SQL语句执行步骤
Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...
- Oracle SQL语句执行流程与顺序原理详解
以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...
- oracle sql语句中包含‘’ 的解决方法
oracle sql语句中包含'&' 的解决方法 参考文章: (1)oracle sql语句中包含'&' 的解决方法 (2)https://www.cnblogs.com/hm1990 ...
- Oracle SQL语句执行过程
前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...
- Oracle查询所有序列;[oracle中如何创建表的自增ID(通过序列);oracle sql语句大全
Oracle查询所有序列 oracle sql语句大全 oracle中如何创建表的自增ID(通过序列)
最新文章
- 求第k小元素:采用特定分治策略
- 快速搭建一个基于知识图谱的智能问答系统
- python 表格格式输出_利用python对excel中一列的时间数据更改格式操作
- signal软件如何退出账号_好视通视频会议软件app下载|好视通视频会议软件 3.15.7.15 官方版...
- Discuz!论坛,如何查看全站最新帖子列表?
- 如何在DataFrame索引某一行
- signature=ae032dcfdc89568ef19ec0c956de36e7,来用百度密语吧!!!
- 07-爬虫验证码破解实战
- HttpClientFactory系列二:集成Polly处理瞬态故障
- 【转】Linux下的多线程编程背景知识
- 阿斯顿马丁宣布放弃内燃机:2026年开始只销售电动或混动车
- annotatedClasses和component-scan冲突吗
- java 反编译 exe_Java反编译
- 51单片机 wifi模块代码编写的历程 esp8266
- 人工智能认知技术,在各行业的应用介绍
- 计算机word公式平均数,平均值word公式怎么用?
- MarkDown学习备忘录
- GEE(7):GEE插件Open Earth Engine extension提高效率
- 解决开发板不兼容earpods问题
- win8计算机配置管理模板,Win8.1使用技巧 用户账户的配置管理