首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle -软解析和硬解析的区别

Oracle -软解析和硬解析的区别
EN

Stack Overflow用户
提问于 2014-10-09 10:34:16
回答 2查看 6.5K关注 0票数 0

在askTom中的解释来看,硬解析和软解析的区别在于,

加载到共享池- SQL源代码被加载到RAM中进行解析。(“硬”解析步骤)

此步骤不是在软解析中完成的。

现在,假设我们执行以下块:

代码语言:javascript
复制
DECLARE
v_emp_no number;
BEGIN
 v_emp_no := 6675;
 SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = v_emp_no;  --STEP 1

  v_emp_no := 1234;
 SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = v_emp_no;   --STEP 2

END;

这两个语句(步骤1和步骤2)完全相同,并且使用绑定变量(在PLSQL中主机变量和绑定变量实际上是相同的),所以这里应该有一个软解析。

查询的sql源代码在这里不能相同,基本上是一样的。

代码语言:javascript
复制
STEP 1 = SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = 6675; 
STEP 2 = SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = 1234; 

那么,oracle如何在第2步进行软解析,因为查询和源代码应该与步骤1不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-09 10:45:36

Oracle有三个“虚拟机”:SQL、PL/SQL和JVM。在您的示例中,两个VM必须进行交互。

查看v$sql_plan,查看从PL/SQL确切传递给SQL解析器的内容。PL/SQL变量将被bind替换。占位符。

您还可以跟踪会话。在跟踪文件中,您将看到游标的一个解析和两个执行。所以很可能只有一个硬解析而没有软解析。您可以多次使用不同的绑定变量重新执行已解析语句.

PS:当从PL/SQL执行SQL时,您应该使用SELECT INTO

票数 0
EN

Stack Overflow用户

发布于 2014-10-09 10:43:27

不,这两种情况下的查询都使用了一个绑定变量:

代码语言:javascript
复制
SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = :B1

因此,Oracle可以对两者使用相同的解析查询,只需绑定不同的值。

如果您可以从系统视图V$SQL中进行选择,那么您可以自己看到这一点:

代码语言:javascript
复制
SQL> select sql_text from v$sql where sql_text like 'SELECT EMP_NAME%';

SQL_TEXT
--------------------------------------------------------------------------------
SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = :B1
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26276216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档