我可以在 11G 中将表固定到 oracle dbms_shared_pool 吗?我看到我不能在 10g 中做到这一点。该表有 4 个数字列和大约 100K 行,它的使用率非常高并且是只读的(这意味着一旦准备好数据,我们就不会插入或更新)。
没找到方法所以来这里问问。另一个问题是我可以将一个高度使用的存储过程固定到 dbms_shared_pool 吗?他们的优势和劣势是什么?有必要吗?
我可以在 11G 中将表固定到 oracle dbms_shared_pool 吗?我看到我不能在 10g 中做到这一点。该表有 4 个数字列和大约 100K 行,它的使用率非常高并且是只读的(这意味着一旦准备好数据,我们就不会插入或更新)。
没找到方法所以来这里问问。另一个问题是我可以将一个高度使用的存储过程固定到 dbms_shared_pool 吗?他们的优势和劣势是什么?有必要吗?
固定表有点毫无意义。Oracle 会将经常使用的数据保留在 DB Buffer Cache 的 MRU 端,因此极不可能被老化。让 Oracle 管理它的好处是它只保留流行的块。也许在您的情况下,所有 100K 行都在不断需求,但这会使您的情况非常不寻常。
如果您有 11g 企业版,则可以利用结果集缓存,它更加专注,并且可以为某些类型的查询提供一些惊人的性能改进。您描述的那种表将是理想的候选者。 了解更多。
这同样适用于大量使用的程序。他们不会变老。
现在,如果您看到大量重新加载您认为应该固定的程序,这表明您的数据库要么缺少 RAM,要么没有正确分配它所获得的 RAM。
我理解的方式是肯定的,如果每次查询结果缓存都是一样的,那就是要走的路。但是,如果您在许多不同的查询中使用查找表,则结果将不可用。您将缓存整个表。然后使用该表的任何查询都将使用内存数据而不是 IO 物理读取数据。
您可以将内存分配给“KEEP”缓冲池(参数buffer_pool_keep
),然后更改表以将其放入保持缓冲池中;这仅允许 KEEP 池中的表在那里缓冲数据,因此如果您在 KEEP 池中只有一个表,并且您将其大小设置为 10 兆字节,理论上整个表可以缓存在内存中。
alter table my_number_stuff storage( bupper_pool keep);