代码之家  ›  专栏  ›  技术社区  ›  Kevin Babcock

如何清除Oracle中的所有缓存项

  •  32
  • Kevin Babcock  · 技术社区  · 15 年前

    我正在优化Oracle数据库上的SQL查询。我想确保在运行每个查询之前清除所有缓存项,以防止误导性能结果。我通过运行以下命令清除共享池(以除去缓存的SQL/Explain计划)和缓冲区缓存(以除去缓存的数据):

    alter system flush buffer_cache;
    alter system flush shared_pool;
    

    我还需要做更多的工作吗,还是这就足够了?

    谢谢!

    4 回复  |  直到 8 年前
        1
  •  8
  •   Doug Porter    15 年前

    刷新共享池应该可以做到这一点,但是Tom Kyte列出了以下几个原因:在某些情况下,您可能无法获得预期的结果:

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6349391411093

        2
  •  4
  •   Daniel Emge    15 年前

    请记住,操作系统和硬件也会进行缓存,这会影响结果。

        3
  •  3
  •   PenFold    15 年前

    您还应该为您的模式甚至整个数据库收集统计信息:

    begin
       dbms_stats.gather_schema_stats('schema_name');
    end;
    

    begin
       dbms_stats.gather_database_stats;
    end;
    

    然后清除共享池。

        4
  •  1
  •   BobC    8 年前

    我认为你会提出误导性的结果 因为 你已经清除了所有的缓存。在现实世界中,数据库只有一次处于这种状态。 实际上,在性能测试时,通常可以接受多次运行查询的做法,这样您就可以看到缓存(和其他优化)的好处。