我知道
select * from employees;
和
select * from Employees;
将生成2个diff SQLid和哈希值,但最终使用相同的hashplan值。 那么它是软解析还是硬解析? 如果计划哈希值相同,两个语句将使用相同的执行计划吗?
我知道
select * from employees;
和
select * from Employees;
将生成2个diff SQLid和哈希值,但最终使用相同的hashplan值。 那么它是软解析还是硬解析? 如果计划哈希值相同,两个语句将使用相同的执行计划吗?
它们是不同的游标,因此,是的,第二个游标将需要完整的解析和优化。
优化器将分别评估每个查询,但是由于它们实际上是相同的查询(相同的表,某些联接,过滤器等),因此它将产生相同的执行计划,除非在解析第一个查询和第二个查询之间有所变化。 / p>
请注意,这是PL / SQL的优势之一,因为编译器会在内部剥离所有格式和大小写差异,这意味着,如果将它们用于PL / SQL,它们将成为同一光标。
,是的,这两个语句将获得不同的sql_id
。但是,正如您在 the following demo 中看到的那样,两个语句的plan_hash_value
保持不变。
由于plan_hash_value
唯一地标识硬解析和相关的执行计划,因此这表明优化器确实确定两个查询相同,并在共享池中检索现有计划,而不是硬解析第二个时间。
create table employees(id int);
select * from employees;
| ID |
| -: |
select sql_id,hash_value,plan_hash_value
from v$sql
where sql_text like 'select * from %mployees';
SQL_ID | HASH_VALUE | PLAN_HASH_VALUE
:------------ | ---------: | --------------:
f34thrbt8rjt5 | 4069246757 | 1445457117
select * from Employees;
| ID |
| -: |
select sql_id,plan_hash_value
from v$sql
where sql_text like 'select * from %mployees';
SQL_ID | HASH_VALUE | PLAN_HASH_VALUE
:------------ | ---------: | --------------:
f34thrbt8rjt5 | 4069246757 | 1445457117
bvgw7mnuubskb | 900063819 | 1445457117
Here 是相关阅读。