我第一次将基于函数的索引与用户定义的函数一起使用,并且在无法使用索引时偶然发现了性能问题。
在内部,基于函数的索引似乎会生成一个隐藏的表列(类型为 varchar2(4000),因为我的函数返回一个 varchar2),并为其编制索引。使用索引时效果很好,但有时我们必须使用该函数作为过滤器进行全表扫描,在这种情况下,我看到性能下降了 6 倍。似乎在这种情况下,Oracle 不使用隐藏列,但为每一行重新计算函数,使查询受 CPU 限制而不是 IO 限制。
有没有办法让 Oracle 也使用该隐藏列进行过滤?我想知道我是否遗漏了一些重写选项或类似的东西。
如果没有,我将不得不自己定义该列并使用触发器使其保持最新。我更喜欢使用基于函数的索引来提高透明度和更容易维护。