Динамические запросы
Если динамический запрос выполняется очень часто, то его следует перевести в статический или использовать его с параметрами. Каждый такой запрос занимает память в SGA, и может вытеснять из неё другие запросы.
Например:
DELETE
FROM EQUIPMENT
WHERE ID_EQUIP = 402
стоит заменить на :
DELETE
FROM EQUIPMENT
WHERE ID_EQUIP = :ID_EQ
Для поиска подобных SQL можно воспользоваться таким запросом:
SELECT MAX(sql_text), COUNT(*)
FROM sys.V_$SQL vs
WHERE executions=1 AND sql_text NOT LIKE '%:%'
GROUP BY SUBSTR( sql_text,1,15)
ORDER BY 2 DESC
или более развёрнутым запросом:
-- возвращает динамические SQL, находящиеся в кэше
SELECT sql_text,executions,first_load_time, disk_reads, buffer_gets,
rows_processed, optimizer_cost, address, hash_value, du.USERNAME
FROM sys.V_$SQL vs, DBA_USERS du
WHERE du.USER_ID=vs.PARSING_USER_ID AND executions=1 AND sql_text NOT LIKE '%:%'
ORDER BY SUBSTR( sql_text,1,15)