Library cache - часть shared pool, область памяти, которая содержит распарсенные выражения.
Парсинг включает в себя проверку синтаксиса выражения, проверку объектов, и проверку привелегий пользователя на эти объекты.
После Oracle проверяет есть ли уже такое же выражение, в library cache.
Soft parse - если выражение уже есть в library cache, то Oracle использует его оптимизированный вариант, его план выполнения.
Hard parse - если выражения нет в library cache, то Oracle оптимизирует выражение, строит новый план выполнения.
Соответсвенно, soft parse лучше чем hard parse с точки зрения производительности.
Посмотреть какие запросы находятся в library cache можно с помощью v$sql.
Пример. Выполним 3 вроде бы одинаковых запроса
select * from emp where deptno=10;
SELECT * FROM emp WHERE deptno = 10;
select /*comment*/ * from emp where deptno=10;
-- посмотрим что в library cache
select sql_text, hash_value, address, executions from v$sql where upper(sql_text) like '%EMP%';
--результат
Получилось 3 разных разобранных запроса.
Это получилось из-за того, что хоть запросы логически выглядят одинаково, но из-за различий в регистре и из-за комментария, Oracle распознал их как 3 разных запроса.
Парсинг включает в себя проверку синтаксиса выражения, проверку объектов, и проверку привелегий пользователя на эти объекты.
После Oracle проверяет есть ли уже такое же выражение, в library cache.
Soft parse - если выражение уже есть в library cache, то Oracle использует его оптимизированный вариант, его план выполнения.
Hard parse - если выражения нет в library cache, то Oracle оптимизирует выражение, строит новый план выполнения.
Соответсвенно, soft parse лучше чем hard parse с точки зрения производительности.
Посмотреть какие запросы находятся в library cache можно с помощью v$sql.
Пример. Выполним 3 вроде бы одинаковых запроса
select * from emp where deptno=10;
SELECT * FROM emp WHERE deptno = 10;
select /*comment*/ * from emp where deptno=10;
-- посмотрим что в library cache
select sql_text, hash_value, address, executions from v$sql where upper(sql_text) like '%EMP%';
--результат
SQL_TEXT | HASH_VALUE | ADDRESS | EXECUTIONS |
---|---|---|---|
select * from emp where deptno=10 | 508465132 | 070000002C193B50 | 1 |
SELECT * FROM emp WHERE deptno = 10 | 1243201595 | 070000002C14A328 | 1 |
select /*comment*/ * from emp where deptno=10 | 330949115 | 070000002C143260 | 1 |
Получилось 3 разных разобранных запроса.
Это получилось из-за того, что хоть запросы логически выглядят одинаково, но из-за различий в регистре и из-за комментария, Oracle распознал их как 3 разных запроса.