预言机:结果函数缓存和 [并发程序 |啧



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

由于某些原因,在我应用结果缓存功能后,程序需要更长的时间。我已经检查了参数和结果缓存表,例如:

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;

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

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

最新更新