关于管理索引的一些问题。
我们看到在一些情况下,索引在几周内没有被分析,即使数据是从它们中插入和查询的--使用这些索引的条件。查询非常缓慢--可能是因为索引被破坏了。
查询以获取索引(有些索引已有几个星期的last_analyzed ):
SELECT
table_name, index_name, index_type, visibility, status, last_analyzed, dropped
FROM
all_indexes;在什么情况下,索引不再被分析?
如何使索引自动分析?
如果索引发生故障,是否仍然需要手动管理索引分析?他们怎么能打破呢?我怎么知道它们坏了?怎么修?在什么时间间隔?
也许没有自动管理?这将是非常令人惊讶的。但是,如果是这样,如何手动管理索引呢?谢谢。
发布于 2020-08-04 19:46:52
首先,仅仅是一些对象有旧的统计数据这一事实并不一定意味着它们需要刷新。
默认情况下,索引(表)将自动分析。
自动化维护任务基础设施(称为AutoTask)将任务安排在Oracle窗口(称为维护窗口)中自动运行。默认情况下,一周中的每一天都会安排一个窗口。自动优化器统计信息收集作为AutoTask的一部分运行。默认情况下,集合在所有预定义的维护窗口中运行。为了收集优化器的统计信息,数据库调用一个内部过程,该过程的操作类似于GATHER_DATABASE_STATS过程,并使用with选项。自动统计信息收集符合数据库中设置的所有首选项。手工收集和自动收集的主要区别在于,后者优先处理需要统计信息的数据库对象。在维护窗口关闭之前,自动收集将评估所有对象,并对没有统计信息或非常旧的统计信息的对象进行排序。
此外(“没有统计数据或非常旧的统计数据”):
简短地总结一下:数据库跟踪表中修改过的行数。当这个数字超过阈值时,统计信息就会被认为是过时的,并且表是收集统计信息的候选数据。
这一阈值的定义:
STALE_PERCENT-此值确定表中必须更改的行的百分比,然后该表上的统计数据才会被认为是陈旧的,并且应该进行重新收集。stale_percent的有效域是非负数.默认值为10,这意味着更改超过10%的表被认为是陈旧的。
SQL> select dbms_stats.get_prefs('STALE_PERCENT') from dual;
DBMS_STATS.GET_PREFS('STALE_PERCENT')
--------------------------------------------------------------------------------
10因此,自上次在对象上收集统计信息以来,每当超过10%的行发生更改时,对象统计信息就会被视为过时。
这个10%的值可能足够,也可能不适合您的表。即使在每个对象的基础上,您也可以手动设置此值,因此统计数据将被认为是过时的。
您还可以选择手动收集统计数据,即使是计划好的作业。
https://dba.stackexchange.com/questions/273199
复制相似问题