技术开发 频道

优化数据库大幅度提高Oracle的性能

    二.分析表和索引,更改优化模式

    Oracle默认优化模式是CHOOSE,在这种情况下,如果表没有经过分析,经常导致查询使用全表扫描,而不使用索引。这通常导致磁盘I/O太多,而导致查询很慢。如果没有使用执行计划稳定性,则应该把表和索引都分析一下,这样可能直接会使查询速度大幅提升。分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令。对于少于100万的表,可以考虑分析整个表,对于很大的表,可以按百分比来分析,但是百分比不能过低,否则生成的统计信息可能不准确。可以通过DBA_TABLES的LAST_ANALYZED列来查看表是否经过分析或分析时间,索引可以通过DBA_INDEXES的LAST_ANALYZED列。

    下面通过例子来说明分析前后的速度对比。(表CASE_GA_AJZLZ大约有35万数据,有主键)首先在SQLPLUS中打开自动查询执行计划功能。(第一次要执行\RDBMS\ADMIN\utlxplan.sql来创建PLAN_TABLE这个表)

    SQL> SET AUTOTRACE ON
    SQL>SET TIMING ON

    通过SET AUTOTRACE ON 来查看语句的执行计划,通过SET TIMING ON 来查看语句运行时间。

    SQL> select count(*) from CASE_GA_AJZLZ;
    COUNT(*)
    ----------
    346639
    已用时间: 00: 00: 21.38
    Execution Plan
    0 SELECT STATEMENT Optimizer=CHOOSE
    1 0 SORT (AGGREGATE)
    2 1 TABLE ACCESS (FULL) OF 'CASE_GA_AJZLZ'
    ……………………

    请注意上面分析中的TABLE ACCESS(FULL),这说明该语句执行了全表扫描。而且查询使用了21.38秒。这时表还没有经过分析。下面我们来对该表进行分析:

    SQL> analyze table CASE_GA_AJZLZ compute statistics;

    表已分析。已用时间: 00: 05: 357.63。然后再来查询:

    SQL> select count(*) from CASE_GA_AJZLZ;
    COUNT(*)
    ----------
    346639
    已用时间: 00: 00: 00.71
    Execution Plan
     
    0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=351 Card=1)
    1 0 SORT (AGGREGATE)
    2 1 INDEX (FAST FULL SCAN) OF 'PK_AJZLZ' (UNIQUE) (Cost=351
    Card=346351)
    …………………………

0
相关文章