我们从prod环境中复制了一个金色的。表最初从prod中被丢弃,然后我们用goldengate开始复制。现在,我们希望将数据迁移到另一个数据库。但是查询计划与prod环境不同。我们认为这是因为复制数据库中的所有统计数据都是坏的/错误的。dba_tables中声明的行数为null,0或不同的50-80%。我们试图在所有相关的表上执行dbms_stats.gather_table_stats。还坏着呢。对于所有有错误统计数据的表,我们都运行这个querie:
dbms_stats.GATHER_TABLE_STATS(OWNNAME => 'SCHEMA', TABNAME => 'TABLE_NAME', CASCADE => true);我们不能带着糟糕的查询计划迁移。
我们正在使用Oracle版本12.2.0.1.0 -生产
编辑:在@Jon回答之后,我们看到一些索引是在prod环境中分区的,而不是在复制中。此外,复制的全局偏好度为32768,prod为NULL。
发布于 2019-10-10 02:39:37
桌子的建造方式完全一样吗?可能是不同的表结构导致统计信息中断,比如一个表被分区,另一个没有。尝试比较DDL:
select dbms_metadata.get_ddl('TABLE', 'TABLE1') from dual;我惊讶地听到,即使在收集了统计数据之后,统计数据也是错误的。尤其是行数--从10g开始,这个数字在默认设置下应该是100%准确的。
您能列出用于收集统计数据的确切命令吗?而且,这是一个扩展,但可能在一个数据库上更改了全局首选项。这将非常糟糕,但您可以将数据库默认设置为只查看0.00001%的数据,这将产生可怕的统计数据。检查两个数据库之间的全局首选项。
--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服务请求的时候了。
(这更像是一个扩展的注释,而不是一个答案,但是可能需要大量代码来诊断这个问题。请用更多的信息更新原来的问题。)
https://stackoverflow.com/questions/58309100
复制相似问题