好久没有写博客(吹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语句硬编码带来的问题以及解决办法相关推荐

  1. oracle sum函数返回空,关于SQL语句中SUM函数返回NULL的解决办法

    SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...

  2. 从sql文件中读取sql语句执行后报语法错误问题的解决办法

    一般的sql文件保存时都为UTF-8编码,默认(如果sql文件中有中文字符)会有一个BOM头,读取并执行的时候会报syntax error语法错误(这个错误搞了好几天,郁闷),这个时候需要将sql文件 ...

  3. oracle中子查询的执行顺序是,Oracle sql语句执行顺序

    sql语法的分析是从右到左 一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...

  4. Oracle sql语句执行顺序

    一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的 ...

  5. Oracle SQL语句执行步骤

    Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...

  6. Oracle SQL语句执行流程与顺序原理详解

    以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...

  7. oracle sql语句中包含‘’ 的解决方法

    oracle sql语句中包含'&' 的解决方法 参考文章: (1)oracle sql语句中包含'&' 的解决方法 (2)https://www.cnblogs.com/hm1990 ...

  8. Oracle SQL语句执行过程

    前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...

  9. Oracle查询所有序列;[oracle中如何创建表的自增ID(通过序列);oracle sql语句大全

    Oracle查询所有序列 oracle sql语句大全 oracle中如何创建表的自增ID(通过序列)

最新文章

  1. 求第k小元素:采用特定分治策略
  2. 快速搭建一个基于知识图谱的智能问答系统
  3. python 表格格式输出_利用python对excel中一列的时间数据更改格式操作
  4. signal软件如何退出账号_好视通视频会议软件app下载|好视通视频会议软件 3.15.7.15 官方版...
  5. Discuz!论坛,如何查看全站最新帖子列表?
  6. 如何在DataFrame索引某一行
  7. signature=ae032dcfdc89568ef19ec0c956de36e7,来用百度密语吧!!!
  8. 07-爬虫验证码破解实战
  9. HttpClientFactory系列二:集成Polly处理瞬态故障
  10. 【转】Linux下的多线程编程背景知识
  11. 阿斯顿马丁宣布放弃内燃机:2026年开始只销售电动或混动车
  12. annotatedClasses和component-scan冲突吗
  13. java 反编译 exe_Java反编译
  14. 51单片机 wifi模块代码编写的历程 esp8266
  15. 人工智能认知技术,在各行业的应用介绍
  16. 计算机word公式平均数,平均值word公式怎么用?
  17. MarkDown学习备忘录
  18. GEE(7):GEE插件Open Earth Engine extension提高效率
  19. 解决开发板不兼容earpods问题
  20. win8计算机配置管理模板,Win8.1使用技巧 用户账户的配置管理

热门文章

  1. vue3:我来吹牛皮
  2. PostgreSQL的MD5认证方法
  3. 计算机路由表更新命令,计算机cmd命令之route,查看路由表,或配置一个更有效的路由...
  4. typora笔记去除英文下面的红色波浪线
  5. 图片转文字怎么在线转换?分享几个好用的方法
  6. 【Python】抓取电影海报并下载
  7. 利用条形码系统进行库存管理
  8. 华为od统一考试B卷【阿里巴巴找黄金宝箱(II)】Python 实现
  9. 树莓派文字转语音 python_基于树莓派的OTON眼镜:将文本转换为语音
  10. 查找树形数据的某个值