我在包上有几个结果缓存函数,定义如下。这个想法是调用这个包函数通过作为并发请求并行运行并收集相同信息的多个程序。
由于某些原因,在我应用结果缓存功能后,程序需要更长的时间。我已经检查了参数和结果缓存表,例如:
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%),则缓存开销将大于收益。