我第一次使用基于函数的索引和用户定义的函数,并且在无法使用索引时偶然发现了性能问题。未使用索引访问时基于函数的索引
在内部,基于函数的索引似乎会生成一个隐藏表列(类型为varchar2(4000),因为我的函数返回一个varchar2),并对它进行索引。当使用索引时,这很好,但有时我们必须使用函数作为过滤器来执行全表扫描,在这种情况下,我看到性能下降了6倍。似乎在这种情况下,Oracle不会使用隐藏的列,但重新计算每行的函数,使查询CPU绑定而不是IO绑定。
有没有办法让Oracle使用该隐藏列也进行过滤?我想知道我是否错过了一些重写选项或者这些内容。
如果不是,我必须自己定义列并使用触发器来保持它最新。我更喜欢使用基于函数的索引进行透明度和更容易维护。
似乎很棘手,因为“隐藏列”不存储在表本身,它是什么组成索引。所以它在表扫描过程中不可用。您必须让Oracle通过索引(或者至少以某种方式加入)来获取预先计算的数据。 – Thilo 2012-07-24 09:39:59
如果这个专栏实际上并不存在,很明显我无法获得两全其美的效果。我只是看着dba_tab_cols,并认为有一个_real_,只是隐藏的列。如果它只是构建索引的虚拟构造,那就回答我的问题 - 需要一个真正的扫描列。 – Chris 2012-07-24 09:54:48
嗯,它是真实的,它存在于索引*内的物化形式*中。与虚拟列相比,虚拟列只是一个定义,其数据即时计算,与视图中的派生列相同。 – Thilo 2012-07-24 09:57:50