首页 文章

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

提问于
浏览
1

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

由于某些原因,在应用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

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

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

相关问题