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