我们最近更新到Oracle 11g,我们的DBA建议使用结果缓存来提高某些查询的性能。通过快速搜索Google,可以看到该功能有criticism及其扩展方式。与任何缓存方案一样,在某种情况下,它会赢得大量时间以及其他失败的情况。我们的使用模式(多次向数据库询问很少变化的相同信息)似乎非常适合结果缓存。
您对该功能有正面还是负面的经验?
答案 0 :(得分:2)
我会非常警惕那些试图让数据库缓存所有查询结果的东西 - 这很可能会导致很多额外的工作维护90%不会受益的查询的结果缓存。 Oracle的高速缓存失效算法非常基础,旨在确保永远不会返回过时结果,因此对基础表的任何更改都将强制使从该表派生的所有结果高速缓存失效。假设您的大多数查询都在按照某些频率进行更改,那么这可能不值得花费。
您真的只想缓存那些结果 - 运行起来很昂贵(否则,缓存结果的边际好处而不仅仅是缓存缓冲区缓存中的数据,就像Oracle已经做的那样很少。缓存单行主键查找可能永远不值得) - 在一段合理的时间内保持不变(确保其他人可以使用缓存) - 大多数是静态的引用表(确保在对表执行DML时不必花费大量时间使缓存结果无效)
答案 1 :(得分:1)
我们的第一次(也是非常初步的)测试显示了相当大的希望。由于我们正在测试的查询缓存命中率可以避免全表扫描(大约350万行),即使是几次点击也很容易使缓存变得有价值。
到目前为止,我们只是做了一个查询,看起来相当安全。我想设置数据库来缓存所有结果,但这可能会更危险。
答案 2 :(得分:1)
在RAC环境中,我总是看到返回值在同一个实例上有效, 但是当它与经常更新表数据的函数一起使用时,我们已经抱怨在与更新完成的实例不同的实例上调用函数时该值是陈旧的。