Разбор вызова должен происходить каждый раз, когда создается новый курсор, даже если оператор находится в кеше библиотеки. Это вызов синтаксического анализа, который проверяет кэш библиотеки. Если оператор найден в кэше библиотеки, это мягкий анализ.
@ DCookie дала ответ на ваш вопрос о проверке жесткого и мягкого анализа. Я ожидаю, что вы обнаружите, что большинство вызовов синтаксического анализа являются мягкими. Обратите внимание, что вы не должны ожидать, что возвращаемое значение из v$sysstat
будет очень близко к общему количеству вызовов синтаксического анализа из v$sql
, так как первое является счетчиком с момента запуска экземпляра, а второе просто показывает операторы, которые в данный момент находятся в кеше библиотеки. .
Единственный способ полностью избежать синтаксического анализа вызовов - это сохранить дескриптор существующего курсора и выполнять его при необходимости, связывая новые значения при необходимости. Иногда это происходит при кэшировании курсоров - это вне вашего явного контроля, хотя я считаю, что есть параметры, которые вы можете изменить, чтобы повлиять на него. В коде PL / SQL вы можете явно использовать курсоры, которые вы создаете и управляете с помощью пакета DBMS_SQL. Я ожидаю, что C # имеет соответствующие возможности.
В любом случае то, на что вы смотрите, вероятно, не проблема. Тот факт, что счет кажется высоким, ни в коем случае не означает, что разбор является узким местом в вашей системе.
Прежде всего, вы должны проверить, находятся ли операторы SQL с таким большим количеством разборов даже под вашим контролем. Когда я сделал измененную версию вашего запроса на одной из моих систем:
select parse_calls, executions, parsing_schema_name,sql_text
FROM v$sql
ORDER BY parse_calls DESC;
Я обнаружил, что все операторы с наибольшим количеством вызовов синтаксического анализа были рекурсивным SQL, проанализированным SYS. Это может быть не так для вас, в зависимости от вашего использования, но это что-то проверить.