首页 文章

立即执行填充库缓存

提问于
浏览
0

我有一个问题,关于如何在库缓存中处理通过'execute immediate'执行的查询(我们使用Oracle 11) .

假设我有这样的函数:

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的原因)所以这给我们留下了一个只在searchvalue(这是一个参数)上有所不同的sql . 在从另一个存储过程内部执行x次的循环中调用此函数 . 在连接生命周期内,通过ODBC连接执行存储过程y次 . 并且有z连接,但每个连接都使用相同的数据库登录 .

现在让我们假设搜索值在一个循环中改变b次 .

问题1:当计算将在库高速缓存中保留多少个sql副本时,我们可以忽略搜索值可以具有的不同值(b),因为该值是作为参数发送以立即执行的吗?

问题2:循环是否会导致查询的硬解析x次(查询将在库缓存中创建x次),或者Oracle可以重用查询吗? (为简单起见,我们假设此问题中的所有调用的搜索值都相同)

问题3:y(在一次连接的生命周期内从odbc调用存储过程的次数)是否也会增加库缓存中保存的查询的副本数量?

问题4:z(具有相同db登录的同时连接数)是否与库缓存中保存的查询副本相乘?

主要问题:我应该在这里期待什么行为?行为是否可配置?这个问题的原因是我们已经将这段代码 生产环境 了4年,现在我们的一位客户回复我们并说“这个查询填满了我们的整个SGA,Oracle说这是你的错” .

1 回答

  • 0

    getfield和searchfield的不同组合的数量应该确定将有多少“副本” . 我谨慎地使用“复制”一词,因为Oracke会将每个变体视为不同 . 由于您正在为searchvalue使用绑定变量,因此您拥有的许多值将不会添加到查询计数中 .

    简而言之,看起来你的代码还可以 .

    连接数不应增加硬解析 .

    请求AWR报告以确切了解SGA中有多少查询,以及触发了多少次硬分析 .

相关问题