Oracle 收集物化视图的统计信息,作为收集模式统计信息的一部分
我们使用以下方法刷新给定架构中所有表的统计信息:Oracle 收集物化视图的统计信息,作为收集模式统计信息的一部分,oracle,statistics,materialized-views,Oracle,Statistics,Materialized Views,我们使用以下方法刷新给定架构中所有表的统计信息: exec dbms_stats.gather_schema_stats(ownname => 'some_schema', estimate_percent => dbms_stats.auto_sample_size, cascade => true, method_opt => 'FOR ALL COLUMNS SIZE AUTO', degree => 12); 但是,这会将物化视图的行数设置为零,并且会产生
exec dbms_stats.gather_schema_stats(ownname => 'some_schema', estimate_percent => dbms_stats.auto_sample_size, cascade => true, method_opt => 'FOR ALL COLUMNS SIZE AUTO', degree => 12);
但是,这会将物化视图的行数设置为零,并且会产生不必要的副作用,导致针对物化视图的查询计划效率低下。我们通过在运行模式统计数据之后收集针对特定MView的表统计数据来解决这个问题
我的问题是:我是否可以更改参数以收集\u schema\u stats,从而导致MVView行计数不设置为零?您不能告诉收集\u schema\u stats排除某些对象。您可以执行“收集过时”操作,以仅收集统计信息过时的对象上的统计信息,但完全有可能包含物化视图。解决这个问题的一些方法
1使用LOCK_TABLE_STATS过程锁定物化视图的统计信息。这将阻止GATHER_SCHEMA_STATS收集这些对象的统计信息,直到调用UNLOCK_TABLE_STATS过程(可能是定期刷新物化视图统计信息的过程的一部分)为止
2在收集架构统计信息之前,使用EXPORT_TABLE_STATS过程保存物化视图的统计信息,然后在GATHER_schema_STATS调用完成后调用RESTORE_TABLE_STATS将物化视图统计信息放回
3不要使用聚集模式统计数据。在循环中调用GATHER_TABLE_STATS,在该循环中排除所需的任何对象。差不多
BEGIN
FOR x IN (SELECT *
FROM dba_tables
WHERE owner = 'SOME_SCHEMA'
AND table_name NOT IN (<<list of MVs>>))
LOOP
dbms_stats.gather_table_stats( x.owner, x.table_name, ... );
END LOOP;
END;
这个问题最好继续问下去。非常感谢。我没有听说过锁表统计。事实证明,重置mview统计数据的并不是聚集模式统计数据。这是dbms_snapshot.refresh。我们将在刷新之前锁定mview统计信息。