我在如下定义的包上有几个结果缓存功能 . 这个想法是这个包函数被几个程序调用,这些程序作为并发请求并行运行并收集相同的信息 .
由于某些原因,在应用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 回答
问题可能是结果缓存回收造成的 . 在结果缓存中,您的记录为900或甚至1800字节,具体取决于数据库编码(varchar2不会在那里压缩) . 检查参数result_cache_max_size的值以估计其中适合的记录数 . 您也可以尝试在执行期间清除结果缓存(DBMS_RESULT_CACHE.FLUSH),以查看您的查询是否立即加速 .
您还需要注意的是,如果唯一输入参数值与所选总行数的比率很高 - 让我们说> 30% - 缓存的开销将大于收益 .