在不使用函数结果缓存的情况下,Oracle在同一查询(事务?)中调用函数时,是否可以重用函数的结果?
我正在使用的应用程序严重依赖于Oracle功能.许多查询最终会多次执行完全相同的函数.
一个典型的例子是:
SELECT my_package.my_function(my_id),
my_package.my_function(my_id) / 24,
my_package.function_also_calling_my_function(my_id)
FROM my_table
WHERE my_table.id = my_id;
Run Code Online (Sandbox Code Playgroud)
我注意到Oracle总是执行这些函数中的每一个,而不是意识到在同一个查询中只是一秒钟之前调用了相同的函数.函数中的某些元素可能会被缓存,从而导致返回速度稍快.这与我的问题无关,因为我想避免整个第二次或第三次执行.
假设这些函数是相当耗费资源的,并且这些函数可以调用更多函数,将它们的结果基于相当大且频繁更新的表(一百万条记录,每小时更新1000次更新).因此,无法使用Oracle的功能结果缓存.
即使数据经常变化,我希望这些函数的结果在从同一查询中调用时也是一样的.
Oracle是否可以重用这些函数的结果以及如何重用?我使用的是Oracle11g和Oracle12c.
下面是一个例子(只是一个随机的无意义函数来说明问题):
-- Takes 200 ms
SELECT test_package.testSpeed('STANDARD', 'REGEXP_COUNT')
FROM dual;
-- Takes 400ms
SELECT test_package.testSpeed('STANDARD', 'REGEXP_COUNT')
, test_package.testSpeed('STANDARD', 'REGEXP_COUNT')
FROM dual;
Run Code Online (Sandbox Code Playgroud)
使用功能:
CREATE OR REPLACE PACKAGE test_package IS
FUNCTION testSpeed (p_package_name VARCHAR2, p_object_name VARCHAR2)
RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY test_package IS
FUNCTION testSpeed (p_package_name VARCHAR2, p_object_name VARCHAR2)
RETURN NUMBER
IS
ln_total NUMBER;
BEGIN
SELECT SUM(position) INTO ln_total …Run Code Online (Sandbox Code Playgroud)