相关文章推荐
私奔的数据线  ·  NLP大牛Thomas ...·  1 年前    · 
幸福的草稿本  ·  Nodejs http request ...·  1 年前    · 
淡定的弓箭  ·  c++ string转二进制-掘金·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

We have one of our system that perform quite a bit of database activity in terms of INSERT/UPDATE/DELETE statements against various tables. Because of this the statistics became stale and this is reflected in overall performance.

We want to create a scheduled job that would periodically invoke DBMS_STATS.GATHER_SCHEMA_STATS . Because we don't want actual stats gathering itself to impact the system processing even more we are thinking to collect statistics quite frequent and use GATHER STALE option:

DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME => 'MY_SCHEMA', OPTIONS =>'GATHER STALE')

This executes almost instantly but running this statement below before and after stats gathering seems to bring back the same records with the same values:

SELECT * FROM user_tab_modifications WHERE inserts + updates + deletes > 0;

The very short time taking to execute and the fact that user_tab_modifications content stays the same makes me question if OPTIONS =>'GATHER STALE' actually does what we expect it should do. On the other hand if I run this again before and after statistics gathering I can see the tables reported as stale before re no longer reported as stale after:

DECLARE
   stale dbms_stats.objecttab;
BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'MY_SCHEMA', OPTIONS =>'LIST STALE', objlist => stale);
  FOR i in 1 .. stale.count 
    dbms_output.put_line( stale(i).objName );
  END LOOP;

On another hand if lets say my_table is one of my tables being listed as part of the tables that part of the user_tab_modifications with inserts + updates + deletes > 0 and I run I can see my_table no longer being reported as having changes.

EXECUTE DBMS_STATS.GATHER_TABLE_STATS(ownname => 'MY_SCHEMA', tabname => 'MY_TABLE');

So my questions are:

  • Is my approach correct. Can I trust I am getting fresh stats just by running options => 'GATHER STALE' or I should manually collect stats for all tables that come back with a reasonable number of inserts, updates, deletes?
  • When user_tab_modifications would actually get reset; obviously GATHER STALE option does not seem to do it
  • We are using Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

    Not sure why my question is flagged about not being about programming. DBMS_STATS is an oracle package and I want to know what is the best way to use it. – Julian Aug 15, 2016 at 7:07

    Got the following info from Oracle docs.

    You should enable monitoring if you use GATHER_DATABASE_STATS or GATHER_SCHEMA_STATS with the GATHER AUTO or GATHER STALE options.

    This view USER_TAB_MODIFICATIONS is populated only for tables with the MONITORING attribute. It is intended for statistics collection over a long period of time. For performance reasons, the Oracle Database does not populate this view immediately when the actual modifications occur. Run the FLUSH_DATABASE_MONITORING_INFO procedure in the DBMS_STATS PL/SQL package to populate this view with the latest information. The ANALYZE_ANY system privilege is required to run this procedure.

    Hope this helps you to identify which of your assumptions are incorrect and understand the correct usage of "GATHER STALE".

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.