【问题标题】:how to pin a table to oracle dbms_shared_pool in 11G如何在 11G 中将表固定到 oracle dbms_shared_pool
【发布时间】:2013-04-05 06:00:05
【问题描述】:

我可以在 11G 中将表固定到 oracle dbms_shared_pool 吗?我看到我不能在 10g 中做到这一点。该表有 4 个数字列和大约 100K 行,它的使用率非常高并且是只读的(这意味着一旦准备好数据,我们就不会插入或更新)。

我没有找到方法所以来这里问。还有一个问题是我可以将一个高度使用的存储过程固定到 dbms_shared_pool 吗?他们的优势和劣势是什么?有必要吗?

【问题讨论】:

    标签: sql database performance oracle oracle11g


    【解决方案1】:

    固定表有点毫无意义。 Oracle 会将经常使用的数据保留在 DB Buffer Cache 的 MRU 端,因此极不可能被老化。让 Oracle 管理它的好处是它只保留流行的块。也许在您的情况下,所有 100K 行的需求都在不断增加,但这会使您的情况变得非常不寻常。

    如果您拥有 11g 企业版,则可以利用结果集缓存,它更加专注,并且可以为某些类型的查询提供一些惊人的性能改进。您描述的那种表将是理想的候选者。 Find out more.

    这同样适用于大量使用的程序。他们不会过时。

    现在,如果您看到大量重新加载您认为应该固定的过程,这表明您的数据库要么缺少 RAM,要么没有正确分配它所获得的 RAM。

    【讨论】:

    • 感谢您的建议,但是固定表 oracle dbms_shared_pool 会减少物理读取吗? Oracle 11g 是否支持 ping 表
    • 不,它不会减少物理阅读。如果您将数据固定在缓冲区缓存中,而不管它是否实际被使用,那么这会减少其他表块的可用内存。因此,原本可能保留在缓存中的内容会过早老化,然后必须在下次需要时重新读取。
    【解决方案2】:

    我的理解是,如果每次查询结果都完全相同,那么结果缓存就是要走的路。但是,如果您在许多不同的查询中使用查找表,则结果将不可用。您将缓存整个表。那么使用该表的任何查询都将使用内存数据而不是 IO 物理读取数据。

    【讨论】:

      【解决方案3】:

      您可以将内存分配给“KEEP”缓冲池(参数buffer_pool_keep),然后更改表以将其放入保持缓冲池;这仅允许 KEEP 池中的表在那里缓冲数据,因此如果您在 KEEP 池中只有一个表,并且您将其大小设置为 10 兆字节,理论上整个表都可以缓存在内存中。

      alter table my_number_stuff storage( bupper_pool keep);
      

      【讨论】:

        猜你喜欢
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多