我们目前有一个 20GB SGA 空间的数据库。SQL 已经过优化,但也必须对其用例进行统计,并且一些查询非常非常慢,特别是当大型结果集作为文本索引搜索的结果返回时,然后由 db 文件顺序读取获取。这会导致应用程序超时,我们的用户会抱怨它们。我们的存储速度很慢,我们无法改变这一点,很遗憾(IO 请求的峰值在 15 到 20 毫秒时很慢)。现在的想法是将这些表(总共 8GB)放入 KEEP 池中,并为数据库提供 16GB 的额外 RAM。此外,我们将在系统上打开大页面。
您认为这是解决问题的好方法吗?有没有我们应该注意的不可预见的陷阱?将桌子放入 KEEP Pool 是否容易?他们会留在 KEEP 池中,还是 Oracle 可能只是忽略存储语句?
数据库版本为 11.2.0.3.0
您可以将表放在 KEEP 池缓存中,这可能会对您的查询产生积极影响。我已经在我的系统中为 16 GB 分区实现了它,并且我们确实获得了良好的性能提升。
但是,将表放入缓存并不意味着其数据会自动加载到内存中。这仅意味着由于我们为这些表使用单独的缓冲池,因此加载到内存中的数据块不会像使用默认缓冲池时那样频繁地从缓冲区中老化。
因此,如果您的查询重复获取相同的数据块,则会减少老化并获得更好的性能提升。但是,如果您的查询正在获取缓存中不存在的不同数据块,那么您将发生一些磁盘读取,并且旧块可能会因缓冲区而老化。
此外,您是否为您的查询评估了 RESULT_CACHE 提示,如果您不使用 GTT,您也可以从中获得良好的性能提升。