oracle中的统计信息问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中的统计信息问题相关的知识,希望对你有一定的参考价值。

为什么统计信息会导致索引失效,我把统计信息删掉后,查询快了好多,有统计信息时,执行计划不走索引

统计信息需要及时更新才会发挥它的作用,旧的统计信息不仅无用,而且会导致查询优化器使用不正确的执行计划,导致查询效率很低。建议的做法不是删除统计信息,而是及时更新表和索引的统计信息。追问

我用analyze table tablename compute statistics; 的话,查询就会变慢,
用了analyze table tablename delete statistics; 的话,查询就很快,但是过大概一天就会变回原来的速度。
再用一次,就又快了, delete 完后,再 compute的话,马上就变慢了 ,到底是怎么回事啊

追答

索引的统计信息也需要更新啊

追问

也更新了的

追答

那就不清楚了.
你可以看看执行计划,再分析下

来自:求助得到的回答
参考技术A 应该是你的表的索引没建好导致的查询慢问题。
可以上网找几篇如何建立索引之类的书看看。

ORACLE索引失效,更新统计信息

有时候建立索引的时候不走索引,排除了字段数据问题和sql写法问题之外,应该是统计信息有问题,得重新收集。

一:解锁统计信息

为了稳定执行计划,一般统计信息都会被锁住的,在更新统计信息的时候得先解锁。
①按用户schema解锁:
EXEC DBMS_STATS.UNLOCK_schema_STATS(‘user_name‘);

②按表模式解锁:先查出被锁定的表
select table_name from user_tab_statistics where stattype_locked is not null;
然后exec dbms_stats.unlock_table_stats(‘user_name‘,‘表名‘);

二:收集统计信息方法:

1.分析表

begin

    dbms_stats.gather_table_stats (

    ownname          => ‘TEST‘,

    tabname          => ‘STUDENT‘,

    estimate_percent => dbms_stats.AUTO_SAMPLE_SIZE,

    degree           => 4,

    cascade          => TRUE);

end;

2.分析用户

begin

    dbms_stats.gather_schema_stats(

ownname          => ‘TEST‘,

estimate_percent => dbms_stats.AUTO_SAMPLE_SIZE,

degree           => 4,

cascade          => TRUE);

end;

3.分析索引

begin

    dbms_stats.gather_index_stats(

    ownname          => ‘TEST‘,

    indname          => ‘IDX_STUDENT_BIRTH‘,

    estimate_percent => dbms_stats.AUTO_SAMPLE_SIZE,

    degree           => 4);

end;

还可以用analyze 来分析,例如:

ANALYZE TABLE  (table_name) COMPUTE STATISTICS;  --分析表
ANALYZE TABLE  (table_name) COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;   --分析索引列
ANALYZE TABLE  (table_name) COMPUTE STATISTICS FOR ALL INDEXES FOR ALL INDEXED COLUMNS;  --分析索引和索引列

三:更新完统计信息后得重新锁住。

CALL DBMS_STATS.LOCK_TABLE_STATS(‘user_name‘,‘table_name‘);

以上是关于oracle中的统计信息问题的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 Oracle 数据库中的统计信息是最新的?

oracle收集统计信息无法开并行

[统计信息]1.Oracle统计信息概述

[统计信息]1.Oracle统计信息概述

如何理解 Oracle 中跟踪文件的统计信息。如CPU、经过时间、查询...等

Oracle里收集与查看统计信息的方法