首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LAST_ANALYZE空在dbms_stats.gather_table_stats之后

LAST_ANALYZE空在dbms_stats.gather_table_stats之后
EN

Stack Overflow用户
提问于 2019-10-09 17:09:08
回答 1查看 531关注 0票数 1

我们从prod环境中复制了一个金色的。表最初从prod中被丢弃,然后我们用goldengate开始复制。现在,我们希望将数据迁移到另一个数据库。但是查询计划与prod环境不同。我们认为这是因为复制数据库中的所有统计数据都是坏的/错误的。dba_tables中声明的行数为null,0或不同的50-80%。我们试图在所有相关的表上执行dbms_stats.gather_table_stats。还坏着呢。对于所有有错误统计数据的表,我们都运行这个querie:

代码语言:javascript
复制
dbms_stats.GATHER_TABLE_STATS(OWNNAME => 'SCHEMA', TABNAME => 'TABLE_NAME', CASCADE => true);

我们不能带着糟糕的查询计划迁移。

我们正在使用Oracle版本12.2.0.1.0 -生产

编辑:在@Jon回答之后,我们看到一些索引是在prod环境中分区的,而不是在复制中。此外,复制的全局偏好度为32768,prod为NULL。

EN

回答 1

Stack Overflow用户

发布于 2019-10-10 02:39:37

桌子的建造方式完全一样吗?可能是不同的表结构导致统计信息中断,比如一个表被分区,另一个没有。尝试比较DDL:

代码语言:javascript
复制
select dbms_metadata.get_ddl('TABLE', 'TABLE1') from dual;

我惊讶地听到,即使在收集了统计数据之后,统计数据也是错误的。尤其是行数--从10g开始,这个数字在默认设置下应该是100%准确的。

您能列出用于收集统计数据的确切命令吗?而且,这是一个扩展,但可能在一个数据库上更改了全局首选项。这将非常糟糕,但您可以将数据库默认设置为只查看0.00001%的数据,这将产生可怕的统计数据。检查两个数据库之间的全局首选项。

代码语言:javascript
复制
--Thanks to Tim Hall for this query: https://oracle-base.com/dba/script?category=monitoring&file=statistics_prefs.sql
SELECT DBMS_STATS.GET_PREFS('AUTOSTATS_TARGET') AS autostats_target,
       DBMS_STATS.GET_PREFS('CASCADE') AS cascade,
       DBMS_STATS.GET_PREFS('DEGREE') AS degree,
       DBMS_STATS.GET_PREFS('ESTIMATE_PERCENT') AS estimate_percent,
       DBMS_STATS.GET_PREFS('METHOD_OPT') AS method_opt,
       DBMS_STATS.GET_PREFS('NO_INVALIDATE') AS no_invalidate,
       DBMS_STATS.GET_PREFS('GRANULARITY') AS granularity,
       DBMS_STATS.GET_PREFS('PUBLISH') AS publish,
       DBMS_STATS.GET_PREFS('INCREMENTAL') AS incremental,
       DBMS_STATS.GET_PREFS('STALE_PERCENT') AS stale_percent
FROM   dual;

如果收集统计数据仍然导致不同的结果,我唯一能想到的就是腐败。可能是创建Oracle服务请求的时候了。

(这更像是一个扩展的注释,而不是一个答案,但是可能需要大量代码来诊断这个问题。请用更多的信息更新原来的问题。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58309100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档