Oracle:结果函数缓存和[并发程序| TkProf]

时间:2015-01-19 17:19:57

标签: oracle plsql

我在如下定义的包上有几个结果缓存功能。我们的想法是调用这个包函数 由多个程序并行运行作为并发请求并收集相同的信息。

由于某些原因,在应用Result Cache Functionallity后,程序花费的时间更长。我检查了参数和 结果缓存表,例如:

V$RESULT_CACHE_OBJECTS
V$RESULT_CACHE_STATISTICS

我可以看到我的对象被缓存了。

由于我将这些程序作为并发请求运行,因此我获取了跟踪文件,但我无法在任何地方看到结果缓存。有什么想法吗?

规格:

Create or replace Package myPackage
As
  Type myRecord Is Record( field1  Number
                         , field2  Varchar2(300)
                         , field3  Varchar2(300)
                         , field4  Varchar2(300));

  Function myFunction ( p_organization_id In Number )
  Return myRecord Result_Cache;

End myPackage;

体:

Create or replace Package Body  myPackage
As

  Function myFunction ( p_organization_id In Number )
  Return myRecord Result_Cache
  Is

    l_record      myRecord;
    l_record_null myRecord;

  Begin

    Select field1
  ,      field2
  ,      field3
  ,      field4
    Into   l_record
    From   My_partners
    Where  1 = 1
    And    partner_type = 3
    And    partner_id   = p_organization_id;

    Return l_record;

    Exception When Others
    Then

      Return l_record_null;

  End myFunction;

End myPackage;

1 个答案:

答案 0 :(得分:0)

问题可能是结果缓存回收造成的。在结果缓存中,您的记录是900+或甚至1800+字节,具体取决于数据库编码(varchar2不会在那里压缩)。检查参数result_cache_max_size的值以估计其中适合的记录数。您也可以尝试在执行期间清除结果缓存(DBMS_RESULT_CACHE.FLUSH)以查看您的查询是否立即加速。

您还需要注意的是,如果唯一输入参数值与所选总行数的比率很高 - 让我们说> 30% - 缓存的开销将大于收益。