Oracle中的SQL在执行之前进行解析一个硬解析包括下面的步骤
加载到共享池中 SQL源代码被加载到内存中
语法解析 Oracle检查语法拼写错误
语义解析 Oracle验证来自数据字典的所有表名和列名并且验证你是否有权访问这些数据
查询转换 如果允许(query_rewrite=true)oracle将把复杂的SQL转换为等价的简单形式
优化 根据模式的统计信息创建执行计划(在g中或许会使用动态的样本统计信息)
创建可执行文件 Oracle创建一个服务于SQL查询的调用本地文件的可执行文件
Oracle提供了 shared_pool_size参数来缓存SQL从而使我们不需要重复解析SQL但是如果shared_pool_size设置太小或者在代码中使用了非重用的SQL(例如包含直接量where name=fred)SQL语句可能会过期
在Oracle中软解析和硬解析的区别是什么?仅仅是上面用红色标明的第一步也就是说软解析不需要重新装载到共享池(以及相关的内存分配)
通常很高的解析调用次数(>/秒)表明你的系统有大量不同的SQL语句或者你的SQL语句没有被重用(例如没有使用绑定变量)
硬解析需要把 SQL语句加载到共享池中硬解析比软解析差很多因为它牵涉到共享池中内存的分配和管理一旦被加载SQL必须完全重新检查语法和语义以及生成可执行目标
如果shared_pool_size设置的太小或者SQL语句没有重用则会发生大量的硬解析
所以要适当的设置共享池大小并且通过主机变量重用SQL