从性能调优的角度来看,理解解析的概念非常重要。解析是SQL执行的主要阶段。接下来是其他阶段:Execute和Fetch。
解析:基本知识
当一个SQL语句被执行时,Oracle引擎对它执行以下动作:
- 验证语法
- 验证语句中引用的对象
- 分配给执行作业的用户的特权
- 验证SQL语句在共享池中是否可用。Oracle引擎将计算SQL语句的哈希值并查找。
- 如果SQL语句不存在,则分配共享内存并在共享池中创建游标。
- 生成执行计划
解析的类型
硬解析(HARD PARSE)
这意味着SQL语句在共享内存中不可用,或者这是一个用户试图执行的全新语句。如果您的共享池很小,那么也可能需要硬解析,因为旧语句已经在共享池中老化了。在这种情况下,需要完成上面提到的所有解析步骤。硬解析需要额外的系统资源。这也被称为“库缓存丢失”(Library Cache Miss)。
软解析(SOFT PARSE)
这意味着SQL语句之前被执行过,并且已经被解析过,并且在内存中可用。所以Oracle只需要执行上面提到的步骤1-3,因为其余的任务已经在前面完成了。这就像努力一次,收获多次一样。这也被称为“库缓存命中”(Library cache Hit),因为您已经解析了语句并可以使用库缓存。
为什么应该避免硬解析
硬解析应该保持在最低限度的原因有两个:
- 生成执行计划是一项非常占用cpu的操作。
- 共享池中的内存是有限的,而且内存操作是序列化的。内存操作使用共享池锁进行,如果发生如此多的硬解析,那么数据库中的其他进程将不得不排队等待以获得共享池锁。因此,硬解析对共享池锁和库缓存锁的数量都有影响。