如何在 oracle 的内存中保留 table?

how to preserve a table in memory in oracle?

我知道oracle会自动在内存中保存经常访问的数据。我很好奇有什么方法可以手动将 table 保存在内存中以提高性能?

是的,你当然可以做到。您需要将 table 固定在数据库缓存中的 KEEP POOL 缓存中。

例如,

ALTER TABLE table_name STORAGE (buffer_pool KEEP);

顺便说一句,Oracle 11g 及更高版本,您可以查看RESULT CACHE。很有用。

看看这个 AskTom link https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:253415112676

简短的回答是否定的,你也不想。

如果您需要那么高的检索性能,请考虑使用像 Times 10 这样的内存数据库。

想想你要求数据库做什么。您要求数据库将 n 个 缓存 内存专用于单个 table 并无限期地保留在那里。在繁忙的数据库中,这只会降低性能,使数据库变得无用。假设您有一个包含数百个 table 的数据库,其中一些很小,一些很大,一些非常大,并放入一些 PK 和索引。

出现一个查询,要求 100K 行数据,每行 1 KB,索引是 100 字节长的字符串。 DB 会分配足够的内存来加载索引,然后开始从磁盘上抓取 8K 的数据块并将它们放入缓存中。

如果你要求它在 ram 中永久存储几 GB 的数据,你会很快 运行 内存不足,除非你有一台非常昂贵的机器,里面有 512 GB 的 ram然后您将开始使用交换文件,那时您的表现就很好了。

如果您在查询时遇到性能问题 运行 解释计划并学习如何使用它来发现瓶颈。我有一台 24 核机器和 48 GB 内存,但我有 tables 和数十亿行数据。我密切关注我的缓存命中率和执行计划。

还要考虑物化视图。