Oracle executeimmediate将填充库缓存
我有一个关于如何通过 “立即执行”在库缓存中处理(我们使用Oracle 11) 假设我有这样一个函数:Oracle executeimmediate将填充库缓存,oracle,caching,oracle11g,execute-immediate,Oracle,Caching,Oracle11g,Execute Immediate,我有一个关于如何通过 “立即执行”在库缓存中处理(我们使用Oracle 11) 假设我有这样一个函数: FUNCTION get_meta_map_value ( getfield IN VARCHAR2, searchfield IN VARCHAR2, searchvalue IN VARCHAR2 ) RETURN VARCHAR2 IS v_outvalue VARCHAR2(32
FUNCTION get_meta_map_value (
getfield IN VARCHAR2,
searchfield IN VARCHAR2,
searchvalue IN VARCHAR2
) RETURN VARCHAR2 IS
v_outvalue VARCHAR2(32767);
sql_stmt VARCHAR2(2000) := 'SELECT '||getfield||' FROM field_mapping, metadata '||
'WHERE field_mapping.metadataid = metadata.metadataid AND rownum = 1 AND '||searchfield||' = :1';
BEGIN
EXECUTE IMMEDIATE sql_stmt INTO v_outvalue USING searchvalue;
...
getfield和searchfield在一个安装中总是相同的(但在另一个安装中有其他值,所以我们使用动态sql)
因此,这就给我们留下了一个sql,它只在searchvalue(这是一个参数)上有所不同。
此函数在循环中调用,该循环从另一个存储过程中执行x次。
存储过程在连接生命周期内通过ODBC连接执行y次。
有z个连接,但每个连接都使用相同的数据库登录
现在我们还假设searchvalue在一个循环中更改了b次
问题1:
在计算库缓存中将保留多少sql副本时,
我们是否可以忽略searchvalue可能具有的不同值(b),因为该值作为参数发送以立即执行
问题2:
循环是否会导致对查询进行x次硬解析(查询将在库缓存中创建x次),或者Oracle是否可以重用该查询?
(为了简单起见,我们假设这个问题中的所有调用的searchvalue都是相同的)
问题3:
是否为y(在一个连接的生存期内从odbc调用存储过程的次数)
是否还要乘以保留在库缓存中的查询副本数
问题4:
z(具有相同数据库登录的同时连接数)是否
乘以保留在库缓存中的查询副本数
主要问题:
我在这里应该期待什么样的行为?
行为是可配置的吗?
产生这个问题的原因是,我们的代码已经生产了4年,现在我们的一位客户回复我们说,“这个查询填满了我们的整个SGA,Oracle说这是你的错。”getfield和searchfield的不同组合的数量应该决定有多少“副本”。我谨慎地使用“拷贝”一词,因为Oracke会将每个变体视为不同的。因为您正在为searchvalue使用绑定变量,所以无论您有多少个值,都不会添加到查询计数中 简言之,看起来您的代码还可以 连接数不应增加硬解析
要求AWR报告查看SGA中这些查询的确切数量,以及触发了多少硬解析 我不同意连接的数量不会增加发布代码的硬解析计数,因为我知道的最后一个动态SQL不能在会话之间共享。由于生成的SQL使用绑定变量,它应该由会话生成一个可重用的语句,但它不能在用户会话之间共享。一般来说,动态SQL应该只用于不经常执行的语句。您可能需要参考以下内容: - - 为性能和可扩展性设计应用程序Oracle白皮书2005年7月 --
enter code here