是否可以强制Oracle在具有用户定义的视图和功能的查询中应用视图合并?

时间:2018-10-15 15:09:33

标签: sql oracle oracle11g query-optimization query-performance

问题是-我被迫使用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合并?

1 个答案:

答案 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...