<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Neil的備忘錄

    just do it
    posts - 66, comments - 8, trackbacks - 0, articles - 0

    Cost Based Optimizer (CBO) and Database Statistics

    Posted on 2009-01-19 16:00 Neil's NoteBook 閱讀(303) 評論(0)  編輯  收藏 所屬分類: ORACLE
    Whenever a valid SQL statement is processed Oracle has to decide how to retrieve the necessary data. This decision can be made using one of two methods:
    • Rule Based Optimizer (RBO) - This method is used if the server has no internal statistics relating to the objects referenced by the statement. This method is no longer favoured by Oracle and will be desupported in future releases.
    • Cost Based Optimizer (CBO) - This method is used if internal statistics are present. The CBO checks several possible execution plans and selects the one with the lowest cost, where cost relates to system resources.
    If new objects are created, or the amount of data in the database changes the statistics will no longer represent the real state of the database so the CBO decision process may be seriously impaired. The mechanisms and issues relating to maintenance of internal statistics are explained below:

    Analyze Statement

    The ANALYZE statement can be used to gather statistics for a specific table, index or cluster. The statistics can be computed exactly, or estimated based on a specific number of rows, or a percentage of rows:
    ANALYZE TABLE employees COMPUTE STATISTICS;
    ANALYZE INDEX employees_pk COMPUTE STATISTICS;

    ANALYZE TABLE employees ESTIMATE STATISTICS SAMPLE 100 ROWS;
    ANALYZE TABLE employees ESTIMATE STATISTICS SAMPLE 15 PERCENT;

    DBMS_UTILITY

    The DBMS_UTILITY package can be used to gather statistics for a whole schema or database. Both methods follow the same format as the analyze statement:
    EXEC DBMS_UTILITY.analyze_schema('SCOTT','COMPUTE');
    EXEC DBMS_UTILITY.analyze_schema('SCOTT','ESTIMATE', estimate_rows => 100);
    EXEC DBMS_UTILITY.analyze_schema('SCOTT','ESTIMATE', estimate_percent => 15);

    EXEC DBMS_UTILITY.analyze_database('COMPUTE');
    EXEC DBMS_UTILITY.analyze_database('ESTIMATE', estimate_rows => 100);
    EXEC DBMS_UTILITY.analyze_database('ESTIMATE', estimate_percent => 15);

    DBMS_STATS

    The DBMS_STATS package was introduced in Oracle 8i and is Oracles preferred method of gathering object statistics. Oracle list a number of benefits to using it including parallel execution, long term storage of statistics and transfer of statistics between servers. Once again, it follows a similar format to the other methods:
    EXEC DBMS_STATS.gather_database_stats;
    EXEC DBMS_STATS.gather_database_stats(estimate_percent => 15);

    EXEC DBMS_STATS.gather_schema_stats('SCOTT');
    EXEC DBMS_STATS.gather_schema_stats('SCOTT', estimate_percent => 15);

    EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES');
    EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES', estimate_percent => 15);

    EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK');
    EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK', estimate_percent => 15);
    This package also gives you the ability to delete statistics:
    EXEC DBMS_STATS.delete_database_stats;
    EXEC DBMS_STATS.delete_schema_stats('SCOTT');
    EXEC DBMS_STATS.delete_table_stats('SCOTT', 'EMPLOYEES');
    EXEC DBMS_STATS.delete_index_stats('SCOTT', 'EMPLOYEES_PK');

    Scheduling Stats

    Scheduling the gathering of statistics using DBMS_Job is the easiest way to make sure they are always up to date:
    SET SERVEROUTPUT ON
    DECLARE
    l_job NUMBER;
    BEGIN

    DBMS_JOB.submit(l_job,
    'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
    SYSDATE,
    'SYSDATE + 1');
    COMMIT;
    DBMS_OUTPUT.put_line('Job: ' || l_job);
    END;
    /
    The above code sets up a job to gather statistics for SCOTT for the current time every day. You can list the current jobs on the server using the DBS_JOBS and DBA_JOBS_RUNNING views.

    Existing jobs can be removed using:
    EXEC DBMS_JOB.remove(X);
    COMMIT;
    Where 'X' is the number of the job to be removed.

    Transfering Stats

    It is possible to transfer statistics between servers allowing consistent execution plans between servers with varying amounts of data. First the statistics must be collected into a statistics table. In the following examples the statistics for the APPSCHEMA user are collected into a new table, STATS_TABLE, which is owned by DBASCHEMA:
      SQL> EXEC DBMS_STATS.create_stat_table('DBASCHEMA','STATS_TABLE');
    SQL> EXEC DBMS_STATS.export_schema_stats('APPSCHEMA','STATS_TABLE',NULL,'DBASCHEMA');
    This table can then be transfered to another server using your preferred method (Export/Import, SQLPlus Copy etc.) and the stats imported into the data dictionary as follows:
      SQL> EXEC DBMS_STATS.import_schema_stats('APPSCHEMA','STATS_TABLE',NULL,'DBASCHEMA');
    SQL> EXEC DBMS_STATS.drop_stat_table('DBASCHEMA','STATS_TABLE');

    Issues

    • Exclude dataload tables from your regular stats gathering, unless you know they will be full at the time that stats are gathered.
    • I've found gathering stats for the SYS schema can make the system run slower, not faster.
    • Gathering statistics can be very resource intensive for the server so avoid peak workload times or gather stale stats only.
    • Even if scheduled, it may be necessary to gather fresh statistics after database maintenance or large data loads.
    For more information see:
    Hope this helps. Regards Tim...

    原文地址: http://www.oracle-base.com/articles/8i/CostBasedOptimizerAndDatabaseStatistics.php#AnalyzeStatement
    主站蜘蛛池模板: 久久精品国产亚洲一区二区三区| 国产免费的野战视频| 日韩在线看片免费人成视频播放| 亚洲欧洲日产专区| 免费看又黄又无码的网站| 亚洲国产精品无码专区影院| 在线视频网址免费播放| 亚洲国产天堂久久久久久| 免费亚洲视频在线观看| 亚洲高清国产拍精品青青草原| 无遮挡国产高潮视频免费观看 | 亚洲人成色777777在线观看| 人体大胆做受免费视频| 久久亚洲中文字幕精品一区| 久久成人永久免费播放| 亚洲AV无码乱码在线观看裸奔| 日韩免费电影网址| 91亚洲性爱在线视频| 破了亲妺妺的处免费视频国产| 天天综合亚洲色在线精品| 亚洲第一区精品观看| 国产成人免费ā片在线观看老同学 | 亚洲一二成人精品区| 18级成人毛片免费观看| 亚洲AV无码国产精品色| 情侣视频精品免费的国产| 丰满少妇作爱视频免费观看| 亚洲成av人在线视| av无码久久久久不卡免费网站| 亚洲国产美女精品久久久| 综合亚洲伊人午夜网 | 中文在线观看国语高清免费| 国产国拍亚洲精品mv在线观看 | 亚洲国产精品午夜电影| 久久久久国产精品免费免费搜索 | 99久久免费国产特黄| 亚洲狠狠狠一区二区三区| 国产男女猛烈无遮挡免费视频网站| 一级特黄录像视频免费| 中文字幕亚洲精品| 爽爽日本在线视频免费|