一 软解析和硬解析
1 解析过程:
1 语法 语义分析
2 权限和对象检查
3 在共享池中进行检测是否有已解析的相同SQL,如果存在 则跳过4 ,5 执行软解析,4-5成本比较高 所以要避免硬解析,绑定变量)
4 选择执行计划(可能有多个执行计划数)
5 生成执行计划
2 查看解析结果
select hash_value,executions,sql_text from $sql like 'sql内容'
以用户为角度进行缓存,所以可能存在多个相同的sql内容的记录
3 查看优化器
show parameter optimizer
optimizer_mode: ALL_ROWS
4 绑定变量
绑定变量的目的是让SQL本身从硬解析转换成软解析 从而减少系统资源的消耗
针对对象 SQL模板相同 但是 条件内容不同的SQL语句
注意点
1 oltp 可以实施绑定变量战略 但是olap 尽量不要用绑定变量 有时候 全表扫描反而效率更高
2 绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样
3 绑定变量适合任何 单条 SQL事务语句 和 存储过程。
案例
1 定义变量
variable i number;
2 赋值 exec :i :=1; exec :i =2
3 查询 select *from tt where id=:i;
select *from tt where id=:i;
二 总结:
1.尽可能的避免硬解析,因为硬解析需要更多的CPU资源,闩等。
2.cursor_sharing参数应权衡利弊,需要考虑使用similar与force带来的影响。
3.尽可能的使用绑定变量来避免硬解析。