问题是-我被迫使用View而不是Table(这是下面列表中的第一种情况)。
1.我以不是那些对象(视图和函数)所有者的用户身份在Where子句中的View with Function上运行查询:
select count(*) from VW_BOOK b where contains(b.title, fn_textconverter('Eden'), 1) > 0;
或
select count(*) from VW_BOOK b where contains(b.title, (select fn_textconverter('Eden') from dual), 1) > 0;
因此,上述查询非常慢,因为Oracle优化器会忽略Table中的索引并将谓词推入View。
2.当我运行相同的查询但不使用View而是使用Table时,它执行得非常快,并应用为表创建的索引:
select count(*) from TB_BOOK b where contains(b.title, fn_textconverter('Eden'), 1) > 0;
3.当我使用View时,在查询中看到的结果相同,但是在不调用函数本身的情况下放置函数的结果而不是函数:
select count(*) from VW_BOOK b where contains(b.title, '\E\d\e\n%', 1) > 0;
当我尝试将optimizer_secure_view_merging设置为False或授予我的用户MERGE VIEW特权时,上述列表中的第一种情况将绕过将谓词推入View的过程执行得非常快。
由于由于策略原因我无法向用户添加其他特权,也无法更改Oracle参数,因此出现问题:
是否可以强制Oracle合并用户定义的视图和函数,而不管我是否将optimizer_secure_view_merging参数设置为TRUE并且没有特权MERGE VIEW?
也许可以通过多种方式将功能设置或重新创建为“安全”功能,以便Oracle可以安全地将其与我的View合并?
答案 0 :(得分:1)
这与安全性无关,但是如果fn_textconverter('Eden')
在每次运行时始终等于\E\d\e\n%
,请尝试确定性地创建函数fn_textconverter
,因此Oracle知道不必这样做重新评估每一行。
即
CREATE OR REPLACE FUNCTION fn_textconverter
( p_in VARCHAR2 ) RETURN VARCHAR2 DETERMINISTIC IS...